在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分钟 结束