通过 Devise for Rails 使用每个用户的“maximum_attempts”值锁定用户

Fer*_*rio 5 ruby ruby-on-rails devise ruby-on-rails-3 ruby-on-rails-4

作为事实上的标准,我们都使用 Devise 在 Rails 应用程序中登录,并在特定次数的失败尝试后使用 Lockable 模块来锁定用户。

\n\n

从 Devise\xe2\x80\x99s源代码和配置选项中config.maximum_attempts = 20,我开始了解当用户尝试提供错误的登录凭据时 Devise 如何执行锁定。配置是在 Rails 应用程序启动时静态定义的initializers

\n\n

我的期望是动态设置maximum_attempts\xe2\x80\x93 这可能吗?如果是这样,请指导我。

\n\n

我在每个管理员下面都有一个超级管理员和用户。基于超级管理员,我想failed_attempt在运行时为每个用户设置不同的值。

\n

Ror*_*ane 3

一种可能的方法是对链接到的Devise 代码进行猴子修补,其中attempts_exceeded?是定义的。Here\xe2\x80\x99s 对需要覆盖的内容的猜测:

\n\n\n\n
module Devise::Models::Lockable\n  # assumes that the User model has a `superadmin` relation\n  #  that has a `maximum_attempts` attribute\n\n  def attempts_exceeded?        \n    self.failed_attempts >= self.superadmin.maximum_attempts\n  end\n\n  def last_attempt?\n    self.failed_attempts == self.superadmin.maximum_attempts - 1\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

这应该可行,但这意味着每当您更新 Devise 时,都存在相关代码被破坏的风险,其后果未知。因此,您必须在每次更新之前查看 Devise 的更改。如果您因此而不愿意更新 Devise,那么如果您更新到已修复安全问题的 Devise 版本速度太慢,最终可能会导致安全问题。所以要小心那些可能出现的问题。

\n\n

一种需要更多前期工作的更安全方法是通过您自己的代码手动锁定用户。的文档Devise::Models::Lockable提到了一个公共方法lock_access!,该方法在调用它时会锁定用户。您可以将全局设置config.maximum_attempts为一些非常高的值,例如 25。然后,在模型上的某些回调中(I\xe2\x80\x99m 不确定哪个回调),调用一个方法,lock_access_based_on_superadmin_limit!该方法lock_access!根据您的自定义规则进行必要的调用。以下定义改编自Devise\xe2\x80\x99s 的部分内容valid_for_authentication?

\n\n
class User\n  # \xe2\x80\xa6\n\n  def lock_access_based_on_superadmin_limit!\n    if failed_attempts >= superadmin.maximum_attempts\n      lock_access! unless access_locked?\n    end\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n