【问题标题】:Devise Remember Me and Sessions设计记住我和会话
【发布时间】:2011-02-17 21:23:20
【问题描述】:

我对设计 gem 配置设置感到困惑:

  # 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 分钟后,即使我点击了“记住我”,它也会要求我再次登录。如果这是真的,那么 remember_for 真的毫无意义。显然我在这里遗漏了一些东西。

【问题讨论】:

  • 我认为你不应该同时使用这两种配置。

标签: ruby-on-rails session devise


【解决方案1】:

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

【讨论】:

  • 我正在升级我需要这个补丁的项目中的 Devise(我写了提到的拉取请求) - 结果证明有问题的提交在 Devise 中,即使拉取请求被拒绝了。所以这两个设置现在应该可以一起工作了。
【解决方案2】:

timeout_in 将在您不活动的 10 分钟内自动将您注销,并且与 remember_me 复选框不兼容。你可以拥有一个,但不能同时拥有。

【讨论】:

  • 无效了,看看下面pat的评论
  • remember_me 不起作用,无论是启用还是禁用超时。
  • 在较新的设计版本中,两个模块都是兼容的,但是可记忆似乎优先于可超时。
【解决方案3】:

先前答案中的信息已过时。我已经测试了我的项目,它使用Rails 4Devise 3.5.1also checked devise code 可以肯定。

现在查看Remember Me复选框是否被选中:

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

  • 如果no,则检查if last_access &lt;= timeout_in.ago,对应使用config.timeout_in

【讨论】:

  • 2015 年 12 月 16 日,相关检查 were removed。所以……听起来“自己看”是现在最可靠的策略。
  • 2016 年 1 月,相关检查重新添加:### 3.5.5 - 2016-22-01 * 错误修复 * 恢复 remember_expired?实现 * 如果记住我正在使用,确保不会触发超时
猜你喜欢
  • 1970-01-01
  • 2017-02-25
  • 2011-01-13
  • 2011-05-27
  • 2011-09-15
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多