Railsのセッションではまる
症状
Railsで書評生活というオレオレ蔵書管理システムを作ってるんですが、一昨日あたりからまったくログインできない状態になった。
Session Expireの設定に難あり
セッションの生存期間をユーザが最後に訪れたときから固定の期間にする、今回のシステムでは1ヶ月と設定していたのだけれども、以下のように設定するのは間違いらしい。
class ApplicationController < ActionController::Base
session :session_expires => 1.months.from_now
end
Wikiの方に思いっきり書いてあるけれども、開発環境ではApplicationControllerはページを読み込まれるたびにリロードされるから、ページを読み込まれるたびに1ヶ月セッションを伸ばしてくれる。しかし本番環境ではApplicationControllerは起動時に一回しか読み込まれないため、セッションの生存期間はサーバが起動した日時から1ヶ月に固定されてしまうのだ。
設定をbefore_filterに
ということで、ユーザがページを読み込むたびにセッションの期限を1ヶ月後まで延ばすにはbefore_filterにするしかない。
class ApplicationController < ActionController::Base
before_filter :reset_session_expires
protected
def reset_session_expires
::ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS.update(
:session_expires => 1.months.from_now
)
end
まあ、ログイン関連の処理はこういう風に自分で書くよりもむしろ、AuthencatedSystemとかに任した方がよさそう。こんなアホなバグ入れることもないしね。