redmineのログインで無限にリダイレクトループ
最近プライベートサーバにredmineを導入したのだが、
ブラウザのcookieを消すなどしてセッションが一度切れた状態となったあと、
redmineにアクセスすると無限にリダイレクトループとなりログイン出来なくなってしまった。
ので暫定処置のメモ。
※設定の「設定」->「認証」->「認証が必要」にチェックが入っている場合に再現。
環境
環境は下記のとおり。OSはFedora16をさくらのVPSで運用してます。
redmineはnginxとunicorn連携。
- os: 3.6.11-4.fc16.i686.PAE
- httpサーバ: nginx/1.0.15
- rails: 3.2.16
- db: mysql 5.5.29
- redmine(svnからcheckout): http://svn.redmine.org/redmine/branches/2.4-stable (rev.12902)
調査・解析
ググってみた
ググってもあまり情報がなく、本家のトラッカに類似のチケットはあがってた。
http://www.redmine.org/issues/12161
"settings.login_required" to 0 in the database will fix the problem.
とあるように、dbのデータを直接書きかえて「認証が必要」の設定を一旦OFFにすることで現象を回避してログインできるが、根本解決に至らずに再現しなくなったことになっている様子。
コードを追う
調べてみたところ、ここで何度もredirectされているよう。
このredirect_toの1行をコメントアウトするとリダイレクトループが止まった。
def require_login
#途中省略
redirect_to :controller => "account", :action => "login", :back_url => url
このメソッドは
def check_if_login_required
# no check needed if user is already logged in
return true if User.current.logged?
require_login if Setting.login_required?
end
から呼ばれるのだが、ログイン画面のコントローラであるらしきAccountControllerの実装は下記のように、check_if_login_requiredをskipすることになっている。
skip_before_filter :check_if_login_required, :check_password_change
ところが使っているrailsのバージョンが古い?(未確認)のか、
これが機能していない。。
そのため何度もAccountControllerへのリダイレクトが無限に繰り返されている。
対処、というか暫定処置
再度ググってみたが、大して情報が見つけられず。
というわけで、超暫定対処だが、
このrequire_loginメソッドでコントローラがAccountControllerだったらリダイレクトしないようにした。
def require_login
#途中省略
if params[:controller] != 'account'
redirect_to :controller => "account", :action => "login", :back_url => url
end
ひとまず不便さは解消。
これでとりあえず様子見かな。
betterな解求ム!