新手问题 redmine 自动退出

minix · 2012年06月13日 · 最后由 minix 回复于 2012年06月26日 · 5588 次阅读

我修改了 redmine 里的一段代码 app/controllers/account_controller.rb

def login
  if request.get?
    logout_user
  else
    #authenticate_user
    uri = URI.parse("http://oa.corp.API.com/general/person_info/pass/oa_auth.php")
    data = { "username" => params[:username], "password" => params[:password] }
    post_data = Net::HTTP.post_form(uri, data)
    if post_data.body == 'OK'
      user = session[:login] = params[:username]
      @account = User.find_by_login(user)
      successful_authentication(@account)
    else
      flash[:notice] = "Login Faild! "
      redirect_to :action => 'login'
    end
  end
rescue AuthSourceException => e
  logger.error "An error occured when authenticating #{params[:username]}: #{e.message}"
  render_error :message => e.message
end

修改之后,可以成功登录,不过在使用一会后就会跳回到登录界面,要求重新登录,再次登录后会留在退出登录前的页面。看了 log, 没看到报错,只是正常的跳转信息。有些时候还得登录好几次才能登录成功。

下面是一段在操作突然跳转到登录界面的 log 信息:

Started GET "/admin/test_email" for 119.145.139.232 at Wed Jun 13 18:32:53 +0800 2012 Processing by AdminController#test_email as HTML Redirected to http://redmine.corp.abc.com/login?back_url=http%3A%2F%2Fredmine.corp.abc.com%2Fadmin%2Ftest_email Filter chain halted as :check_if_login_required rendered or redirected Completed 302 Found in 8ms (ActiveRecord: 1.4ms)

Started GET "/login?back_url=http%3A%2F%2Fredmine.corp.abc.com%2Fadmin%2Ftest_email" for 119.145.139.232 at Wed Jun 13 18:32:53 +0800 2012 Processing by AccountController#login as HTML Parameters: {"back_url"=>"http://redmine.corp.abc.com/admin/test_email"} Rendered account/login.html.erb within layouts/base (2.5ms) Completed 200 OK in 19ms (Views: 11.0ms | ActiveRecord: 1.7ms)

请问一下是这段代码有什么错吗?还是会是其它问题? 先谢谢!

请求支援!

不知道哪段才是你改的。

看看 check_if_login_required 这个过滤器的原理,什么情况会触发。

这个问题得要自己添加一些 log 跟踪才行,远程很难跟踪。

@Rei 非常感谢您的回复

app/controllers/account_controller.rb 未修改前的

def login
     if request.get?
       logout_user
     else
       authenticate_user
     end
   rescue AuthSourceException => e
     logger.error "An error occured when authenticating #{params[:username]}: #{e.message}"
     render_error :message => e.message
   end

修改之后的

def login
     if request.get?
       logout_user
     else
       #authenticate_user
       uri = URI.parse("http://oa.corp.API.com/general/person_info/pass/oa_auth.php")
       data = { "username" => params[:username], "password" => params[:password] }
       post_data = Net::HTTP.post_form(uri, data)
       if post_data.body == 'OK'
         user = session[:login] = params[:username]
         @account = User.find_by_login(user)
         successful_authentication(@account)
       else
         flash[:notice] = "Login Faild! "
         redirect_to :action => 'login'
       end
     end
   rescue AuthSourceException => e
     logger.error "An error occured when authenticating #{params[:username]}: #{e.message}"
     render_error :message => e.message
   end

#3 楼 @minix 1,你应该用 git,然后 git diff。 2,你应该修改了不就只有这一处,我怀疑你改了 session 的东西。你可以贴一贴在 gist。

@zhenning , 感谢!

嗯,我改的就只有这处,修改后一两个星期都不会出现这种情况,是最近修改了邮件配置后才发现有这个问题。

我现在怀疑是每次跳转页面时都会读取 session,登录时系统却不会记录到 session,跳转就会出现问题。所以我怀疑是我修改的地方有问题。

有一个奇怪的原因是 当重启了 thin(我使用 thin 作服务)的一段时间(5 分钟左右)内不会有自动跳转到登录页面的现象,过完这几分钟就会很频繁的跳转了!

#5 楼 @minix 如果没改其它地方,你可以把代码退回去更改前的状态,然后看看还会不会出现这样的情况,就可以区分开你的代码问题,还是配件配置和 thin 的问题。

@zhenning 我将代码回退到初始状态,还是会跳转。

终于找到原因了:是 nginx, nginx 上有很多个 server, 发现其中有一个 server 跟它有矛盾,这个 server 主要做接口在使用中,用 php 来写的。当注释掉这个 server 或者将 redmine 搬到了另外机器上 redmine 就不会出现任何问题,会一直好好的。 不过不使用 nginx,直接用端口访问 redmine 也会出现跳转。

再得请教各位一问题了,难道那个 server 和 redmine 抢 session 导致问题的出现?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号