我对设计宝石配置设置感到困惑:
# 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
我想让用户选择"记住我"复选框(即,让我保持登录状态),但默认会话超时为10分钟。 10分钟后,它要求我再次登录,即使我点击了#34;记住我"。如果这是真的那么remember_for真的没有意义。显然我在这里遗漏了一些东西。
答案 0 :(得分:28)
Ryan是正确的,因为默认的Devise gem不支持:rememberable和:timeoutable选项。然而,像所有Ruby一样,如果你不喜欢其他编码器做出的决定,特别是当它偏离了大多数用户可能期望的规范时,那么你可以简单地覆盖它。
感谢(拒绝)pull request我们可以通过将以下代码添加到Devise配置文件(/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
现在,您可以配置这两个选项,并让它们按预期工作。
config.remember_for = 2.weeks
config.timeout_in = 30.minutes
答案 1 :(得分:17)
timeout_in
会在不活动的10分钟内自动退出,并且与remember_me
复选框不兼容。你可以有一个,但不能两个。
答案 2 :(得分:9)
之前答案中的信息已过时。我已经测试了我的项目,该项目使用Rails 4
和Devise 3.5.1
以及also checked devise code来确定。
现在查看是否已选中Remember Me
复选框:
如果yes
,它会检查if remember_exists_and_not_expired
,因此基本上使用config.remember_for
进行会话管理
如果no
,它会相应地使用if last_access <= timeout_in.ago
检查config.timeout_in