这似乎很简单:我试图让我的rails活动记录会话超时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
这似乎不起作用,或者至少我的会话没有超时。我找不到太多关于Rails 3的方法,因为我知道Rails 2.x已经改变了。
谁能帮我一下吗?我认为您将不得不手动执行此操作,因为活动记录存储不实现expire_after选项。在你的(我假设)before过滤器中,你应该这样做:
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版开始就出现在rails中了。我在这里找到了相关的代码。这是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会话创建类方法的示例。您可以使用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
moch说:
我认为您将不得不手动执行此操作,因为活动记录存储不实现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在每次向应用程序发出请求后都会自动延长。会话一直持续到浏览器退出。
我做了上面的技巧来跨域"全球化"会话以实现简单的SSO功能,到目前为止似乎还有效。
过期时间
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_in2.分钟结束