在Rails 3中设置会话超时

Cia*_*her 45 session activerecord ruby-on-rails ruby-on-rails-3

这看起来很简单:我试图让我的rails Active Record会话在2分钟后超时.所以两分钟后我希望我的用户必须重新登录.

我刚刚rails server在我的本地开发机器上运行(即WebBrick).

我知道这与以下代码有关config/initalizers/session_store.rb,但我不认为我已经完全钉了它:

CodedOn::Application.config.session_store :active_record_store

CodedOn::Application.configure do
    config.action_controller.session = {:expire_after => 2.minutes}
end
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,或者至少我的会话似乎没有超时.我找不到很多关于Rails 3的方法,因为我知道Rails 2.x已经改变了.

有人可以帮我吗?

mor*_*itz 46

我认为您必须手动执行此操作,因为活动记录存储未实现expire_after选项.所以在你(我假设)过滤之前,你应该这样做:

def authenticate
  if session[:logged_in]
    reset_session if session[:last_seen] < 2.minutes.ago
    session[:last_seen] = Time.now
  else
    ... authenticate
    session[:last_seen] = Time.now
  end
end
Run Code Online (Sandbox Code Playgroud)

显然,这不完整,但它应该给你基本的想法.

更新:

从版本2.3开始,似乎功能IS存在于rails中.我在这里找到了相关的代码.这是AbstractStore,它应该作为所有派生类的基类.所以,正如dadooda所说,以下应该有效:

Some::Application.config.session_store :active_record_store, {
  expire_after: 24.hours,
}
Run Code Online (Sandbox Code Playgroud)


Rav*_*dra 41

我以简单的方式做到了这一点你可以试试这个:

在你config/initializers/session_store.rb刚才这样做:

Yourapp::Application.config.session_store :cookie_store, 
                                             :key => "_yourapp_session",
                                             :expire_after => 2.minutes
Run Code Online (Sandbox Code Playgroud)

这对我很好,希望也适合你.

  • 这在Rails 4中也可以正常工作. (2认同)
  • 在Rails 5.0.0中也可以使用。 (2认同)