[英]Locking a user using a per-user `maximum_attempts` value with Devise for Rails
作为事实上的标准,我们都在我们的Rails应用程序中使用Devise登录,并且在特定次数的失败尝试之后将使用Lockable模块锁定用户。
从Devise的源代码和配置选项config.maximum_attempts = 20
,我开始了解当用户尝试提供错误的登录凭据时Devise如何执行锁定。 配置是在initializers
程序中的Rails应用程序启动时静态定义的。
我的期望是动态设置maximum_attempts
- 这可能吗? 如果是这样,请指导我。
我在每个管理员下面都有一个superadmin和用户。 基于超级管理员,我想在运行时为每个用户设置不同的failed_attempt
值。
一种可能的方法是修补你链接到的Devise代码,其中的attempts_exceeded?
被定义为。 以下是对需要覆盖的内容的猜测:
module Devise::Models::Lockable
# assumes that the User model has a `superadmin` relation
# that has a `maximum_attempts` attribute
def attempts_exceeded?
self.failed_attempts >= self.superadmin.maximum_attempts
end
def last_attempt?
self.failed_attempts == self.superadmin.maximum_attempts - 1
end
end
这应该可行,但这意味着无论何时更新Devise,都存在相关代码中断的风险,并带来未知后果。 因此,您必须在每次更新之前查看对Devise的更改。 如果由于这一点而不鼓励更新Devise,如果你太慢而无法更新到具有固定安全问题的Devise版本,那么最终可能会导致安全问题。 所以要小心那些可能的问题。
需要更多工作的更安全的方法是手动锁定用户自己的代码。 Devise::Models::Lockable
的文档提到了一个公共方法lock_access!
当你调用它时会锁定用户。 您可以将全局config.maximum_attempts
设置为某个非常高的值,例如25.然后,在模型的某些回调中(我不确定哪个回调),调用方法lock_access_based_on_superadmin_limit!
调用lock_access!
如有必要,根据您的自定义规则。 以下定义是根据Devise的valid_for_authentication?
一部分改编的valid_for_authentication?
:
class User
# …
def lock_access_based_on_superadmin_limit!
if failed_attempts >= superadmin.maximum_attempts
lock_access! unless access_locked?
end
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.