红宝石在轨道上-设计记住我和会议

我对devise 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”实际上是没有意义的。 显然我在这里错过了一些东西。

Arthur Frankel asked 2020-08-11T00:54:02Z
3个解决方案
28 votes

Ryan是正确的,因为默认的Devise gem不支持:rememberable和:timeoutable选项。 但是,就像Ruby一样,如果您不喜欢其他编码器做出的决定,尤其是当它偏离大多数用户可能期望的规范时,您可以简单地覆盖它。

由于有了(被拒绝的)pull请求,我们可以通过在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
douglasr answered 2020-08-11T00:54:36Z
17 votes

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

Ryan Bigg answered 2020-08-11T00:54:07Z
9 votes

先前答案中的信息已过时。 我已经测试了我的项目,该项目使用了noif last_access <= timeout_in.ago,并且还检查了设计代码以确保。

现在查看是否选中了no复选框:

  • 如果no,则检查if last_access <= timeout_in.ago,因此基本上使用config.timeout_in进行会话管理

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

Rustam A. Gasanov answered 2020-08-11T00:55:10Z
translate from https://stackoverflow.com:/questions/5034846/devise-remember-me-and-sessions