【问题标题】:devise: set timeout_in dynamically with custom session controller on before/after actions设计:使用自定义会话控制器在前/后操作上动态设置 timeout_in
【发布时间】:2020-01-28 14:53:17
【问题描述】:

我正在尝试为用户创建一个快速登录系统,我需要如果他们激活此选项,会话将在 20 秒后超时。

我在 CustomSessionController 中所做的是:

class CustomSessionsController < Devise::SessionsController
  before_action :before_login, only: :create, if: :fastlogin?
  after_action :after_login, only: :create, if: :fastlogin?

  def before_login
    user = finduserlogic…
    if user && user.valid_password?(params[:user][:password])
      user.fastlogin = true
      user.save!
    end
  end

  def after_login
    current_user.fastlogin = false
    current_user.save!
  end

  def fastlogin?
    params[:user][:fastlogin].present?
  end
end

因此,这会将 fastlogin 字段在登录前设置为 true,在登录后设置为 false。

然后在 User 模型中我重写 timeout_in 方法:

def timeout_in
  if self.fastlogin
    20.seconds
  else
    Devise.timeout_in
  end
end

问题是,似乎 fastlogin 在 user.timeout_in 方法中永远不会变为 true,但调试它似乎在钩子之前和之后发生了变化。

【问题讨论】:

    标签: ruby-on-rails session devise


    【解决方案1】:

    设计可超时策略不适用于可变超时:timeout_in 在检查会话有效性时应该是正确的(在登录后的每个请求上,当您已经将 fastlogin 设置回 false 时),而不是在创作中。

    在您的情况下,超时是单个会话的属性,而不是用户的属性,因此您必须将其保留在看守会话中并用于计算。 请参阅hook for timeoutable 了解其工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 2015-06-26
      相关资源
      最近更新 更多