在Rails 3中设置会话超时

这似乎很简单:我想让我的轨活动logging会话超时2分钟后。 所以两分钟后,我想我的用户不得不重新login。

我只是在我的本地开发机器上运行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 

这似乎并没有工作,或至less我的会议似乎没有超时。 我无法find很多关于Rails 3的方法,因为我知道事情已经从Rails 2.x中改变了。

有人可以帮我吗?

我认为你将不得不手动这样做,因为活动logging存储没有实现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 

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

更新

从版本2.3开始,似乎function是存在于rails中的。 我在这里find了相关的代码。 这是AbstractStore,它应该作为所有派生类的基类。 所以,正如dadooda所言,以下应该是有效的:

 Some::Application.config.session_store :active_record_store, { expire_after: 24.hours, } 

我以简单的方式做到了这一点:

在你的config/initializers/session_store.rb只是做到这一点:

 Yourapp::Application.config.session_store :cookie_store, :key => "_yourapp_session", :expire_after => 2.minutes 

这对我很好,希望也能为你效劳。

你必须手动完成。 以下是为ActiveRecord会话创build类方法的示例。 您可以使用Rufus-Scheduler和/或DelayedJob来定期调用它。

 class Session < ActiveRecord::Base def self.sweep(time = 1.hour) if time.is_a?(String) time = time.split.inject { |count, unit| count.to_i.send(unit) } end delete_all "updated_at < '#{time.ago.to_s(:db)}' OR created_at < '#{2.days.ago.to_s(:db)}'" end end 

关于为什么这很重要的更多背景: http : //guides.rubyonrails.org/security.html#session-expiry

mosch说:

我认为你将不得不手动这样做,因为活动logging存储没有实现expire_after选项。

看起来不再是这样了。 :expire_after在Rails 3.2.11中为我工作:

 Some::Application.config.session_store :active_record_store, { key: "some_session_id", domain: ".isp.com", expire_after: 24.hours, } 

每次向应用程序发送请求后,Cookie都会自动延长。 会话持续通过浏览器退出。

为了简单的SSOfunction,我做了上面的技巧来跨域“全局化”会话,似乎工作到目前为止。

到期时间。

 MAX_SESSION_TIME = 60 * 60 before_filter :prepare_session def prepare_session if !session[:expiry_time].nil? and session[:expiry_time] < Time.now # Session has expired. Clear the current session. reset_session end # Assign a new expiry time, whether the session has expired or not. session[:expiry_time] = MAX_SESSION_TIME.seconds.from_now return true end 

只要在模型中添加timeout_in方法,它应该做的伎俩:

   def timeout_in
     2分钟
  结束