一种可能的方法是猴子修补you linked to,其中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::Models::Lockable
的文档提到了一个公开的方法lock_access!
,用于在您调用时锁定用户。您可以将全局config.maximum_attempts
设置为一些非常高的值,例如25.然后,在模型的某个回调中(我不确定哪个回调),请根据您的自定义规则调用方法lock_access_based_on_superadmin_limit!
,根据需要调用lock_access!
。以下定义适用于part of Devise’s 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
对于每个用户?你为什么要这样的行为?如果您获得了1000位用户,该怎么办?你想单独管理他们所有的人吗? –
是@TheCha͢mp,Superadmin1可能有1000个用户,并且对于所有这1000个用户,failed_login_attempt应该是ex:3,super admin2可能有5个作为failed_login_attempt ... –
它似乎有很多工作很少有收获......为什么不设置全球?我想这取决于你... –