设计记住我和会话

时间:2011-02-17 21:23:20

标签: ruby-on-rails session devise

我对设计宝石配置设置感到困惑:

  # 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真的没有意义。显然我在这里遗漏了一些东西。

3 个答案:

答案 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 4Devise 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