记住我和会话
我很困惑的devisegemconfiguration设置:
# The time the user will be remembered without asking for credentials again. config.remember_for = 2.weeks # The time you want to timeout the user session without activity. After this # time the user will be asked for credentials again. config.timeout_in = 10.minutes
我想有一个用户select“记住我”checkbox(即,让我login),但默认的会话超时是10分钟。 10分钟后,我要求我再次login,即使我点击了“记住我”。 如果这是真的那么remember_for是没有意义的。 显然我在这里错过了一些东西。
timeout_in
会在不活动的10分钟内自动注销,并且与remember_me
checkbox不兼容。 你可以有一个,但不是两个。
Ryan是正确的,因为默认的Devise gem不支持:rememberable和:timeout选项。 然而,就像所有的Ruby一样,如果你不喜欢其他编码器所做的决定,特别是当它偏离大多数用户可能期望的标准时,那么你可以简单地覆盖它。
感谢(拒绝) 拉取请求,我们可以通过将以下代码添加到Deviseconfiguration文件(/config/initializers/devise.rb)的顶部来覆盖此行为:
module Devise module Models module Timeoutable # Checks whether the user session has expired based on configured time. def timedout?(last_access) return false if remember_exists_and_not_expired? last_access && last_access <= self.class.timeout_in.ago end private def remember_exists_and_not_expired? return false unless respond_to?(:remember_expired?) remember_created_at && !remember_expired? end end end end
现在,这将允许您configuration这两个选项,并让他们按预期工作。
config.remember_for = 2.weeks config.timeout_in = 30.minutes
以前答案中的信息已经过时了。 我testing了我的项目,它使用了Rails 4
和Devise 3.5.1
, 并且检查了devise代码 。
现在看起来是否Remember Me
checkbox被选中:
-
如果
yes
,它会检查if remember_exists_and_not_expired
,所以基本上使用config.remember_for
进行会话pipe理 -
如果
no
,则检查if last_access <= timeout_in.ago
,相应地使用config.timeout_in