devise: динамически устанавливать timeout_in с помощью настраиваемого контроллера сеанса до / после действий - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь создать систему быстрого входа для пользователей, и мне нужно, чтобы, если они активируют эту опцию, сеансы будут синхронизированы через 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.

Затем в модели пользователя я переопределяю метод timeout_in:

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

Проблема в том, что fastlogin никогда не превращается в true в методе user.timeout_in, но при отладке кажется, что он изменяется до и после ловушек.

1 Ответ

0 голосов
/ 28 января 2020

Разработка стратегии с возможностью определения времени не подходит для переменных тайм-аутов: timeout_in должна быть правильной во время проверки правильности сеанса (для каждого запроса после входа в систему, когда вы уже установили fastlogin обратно на false), а не при создании.

В вашем случае тайм-аут является свойством одного сеанса, а не пользователя, поэтому вы должны держать его в сеансе надзирателя и использовать для расчетов. Смотрите крюк для расписания , чтобы понять, как это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...