Rails + 设计:如何检查登录时是否记住了用户

Rails + Devise: How can I check if a user is remembered when signing in

我如何知道正在登录的用户是否通过较早的会话被记住。

我找到了这个答案: 它说 after_remembered 方法在记住用户后被调用。我试了一下并将其放入我的模型中,但没有被调用。 我什至在这一行 https://github.com/plataformatec/devise/blob/master/lib/devise/strategies/rememberable.rb#L30 之前放了一个 binding.pry 但整个认证!方法甚至在登录时都不会被调用。

希望有人能帮忙

好吧,我之前创建 after_update 回调的想法没有奏效,因为它不会在记住的会话中得到更新。

我最后做的不是很漂亮,但我也不想成为 monkeypatch warden。

class Users::SessionsController < Devise::SessionsController
  around_action :check_remembered, only: :create

  def create
    super
  end

  private
  def check_remembered
    # find the user based on the email in the login params. 
    # You can't use current_user here because once you call it, 
    # it will update the user before the action even ran (no idea why)
    user = User.find_by_email(params[:user][:email])
    yield
    if user && user.sign_in_count != current_user.sign_in_count
      # user was not remembered
    end
  end
 end

对于仅电子邮件登录,这就足够了。如果您使用的是 omniauth 登录,那么您必须通过检查 params[:user][:email] 是否存在来阻止 check_remembered 函数中的每个 omniauth 登录。这些必须在您的 omniauth 控制器中处理。