ruby 如何使用Devise gem检测失败的登录尝试?

8cdiaqws  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(101)

我想检测失败的登录尝试,我想避免猴子修补。
最初,我认为我可以简单地使用Warden before_failure钩子:

Warden::Manager.before_failure do |env, opts|
  # failed login?
end

字符串
然而,这并不像预期的那样工作--当你试图访问一个经过身份验证的资源而没有经过身份验证时,也会调用这个钩子--而不仅仅是一个失败的登录尝试。
我发现Devise::SessionsController在身份验证过程中向Warden传递了一个recall密钥。这意味着下面的代码在技术上可以工作:

Warden::Manager.before_failure do |env, opts|
  next unless opts.key?(:recall)

  # failed login attempt!
end


然而,这看起来不像是一个“官方”的解决方案,我在Devise文档中找不到任何关于如何处理这个问题的建议。我应该如何解决这个问题而不对SessionsController进行猴子修补?

zpjtge22

zpjtge221#

你可以使用before_failure方法,只需要检查是否传递了任何参数。如果没有的话,那也不是失败的尝试.将:user更改为任何型号。

Warden::Manager.before_failure do |env, opts|
    email = env["action_dispatch.request.request_parameters"][:user] &&
            env["action_dispatch.request.request_parameters"][:user][:email]

    unless email.blank?
      ## login failed - do something
    end
   
  end

字符串

相关问题