记住我和会话

我很困惑的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_mecheckbox不兼容。 你可以有一个,但不是两个。

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 4Devise 3.5.1 , 并且检查了devise代码 。

现在看起来是否Remember Mecheckbox被选中:

  • 如果yes ,它会检查if remember_exists_and_not_expired ,所以基本上使用config.remember_for进行会话pipe理

  • 如果no ,则检查if last_access <= timeout_in.ago ,相应地使用config.timeout_in