: O. Yuanying

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とかに任した方がよさそう。こんなアホなバグ入れることもないしね。