一種可能的方法是猴子修補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 ... –
它似乎有很多工作很少有收穫......爲什麼不設置全球?我想這取決於你... –