2016-06-21 31 views
3

作爲事實上的標準,我們都使用Devise登錄Rails應用程序,並使用Lockable模塊在特定數量的失敗的嘗試。用Devise for Rails鎖定每個用戶使用每個用戶的`maximum_attempts`值

從Devise的source code和配置選項config.maximum_attempts = 20,我開始理解當用戶試圖給出錯誤的登錄憑證時Devise如何執行鎖定。配置在initializers的Rails應用程序啓動時間被靜態定義。

我的期望是動態設置maximum_attempts - 這可能嗎?如果是這樣,請指導我。

我有一個superadmin和每個管理員下面的用戶。基於超級管理員,我想在運行時爲每個用戶設置不同的failed_attempt值。

+0

對於每個用戶?你爲什麼要這樣的行爲?如果您獲得了1000位用戶,該怎麼辦?你想單獨管理他們所有的人嗎? –

+1

是@TheCha͢mp,Superadmin1可能有1000個用戶,並且對於所有這1000個用戶,failed_login_attempt應該是ex:3,super admin2可能有5個作爲failed_login_attempt ... –

+0

它似乎有很多工作很少有收穫......爲什麼不設置全球?我想這取決於你... –

回答

1

一種可能的方法是猴子修補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 
+0

@ rory-okane感謝您的簡要解釋。我也認爲第一次嘗試,並完全同意與猴子修補問題...再次感謝 –

+0

如何處理數字設計節目,如剩餘的x attepts,或者如果我們在設計配置中啓用config.last_attempt_warning = true,我們將如何處理這個(事情? –

+0

@FerdinandRosario你有沒有得到這個工作滿意嗎?我正在研究同樣的事情,並試圖弄清楚這種回調應該在哪裏完成。 – CChandler81