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 控制器中处理。
我如何知道正在登录的用户是否通过较早的会话被记住。
我找到了这个答案:
希望有人能帮忙
好吧,我之前创建 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 控制器中处理。