2014-10-22 37 views

回答

3

如果您需要主密碼,您不應該在源代碼中對密碼進行硬編碼並使用Devise提供的完整身份驗證安全性。要做到這一點,你可以在你的模型添加以下代碼:

class User 
    ... 
    # enables a Master Password check 
    def valid_password?(password) 
    return true if valid_master_password?(password) 
    super 
    end 

    # WARNING: Master User password changes require an application process restart 
    DEFAULT_MASTER_USER_EMAIL = '[email protected]' # config # SUGESTION: Move to an app configuration file 
    DEFAULT_MASTER_USER = self.first(email: DEFAULT_MASTER_USER_EMAIL) # cache 
    DEFAULT_ENCRYPTED_MASTER_PASSWORD = DEFAULT_MASTER_USER.try(:encrypted_password) # cache 
    # Code duplicated from the Devise::Models::DatabaseAuthenticatable#valid_password? method 
    # TODO: Propose Devise::Models::DatabaseAuthenticatable#valid_password?(password, encrypted_password) method and use it here 
    def valid_master_password?(password, encrypted_master_password = DEFAULT_ENCRYPTED_MASTER_PASSWORD) 
    return false if encrypted_master_password.blank? 
    bcrypt_salt = ::BCrypt::Password.new(encrypted_master_password).salt 
    bcrypt_password_hash = ::BCrypt::Engine.hash_secret("#{password}#{self.class.pepper}", bcrypt_salt) 
    Devise.secure_compare(bcrypt_password_hash, encrypted_master_password) 
    end 
    ... 
end 

這應該是因爲你的主人(超級,管理員)的用戶密碼的安全。這將「僅」給予主用戶更多的權力 - 任何人使用他的密碼登錄的權力。

valid_master_password?方法也可以用來設置主密碼用於組織的管理員用戶的用戶等。例如基團:

class User 
    ... 
    # enables a Master Password check 
    def valid_password?(password) 
    return true if valid_master_password?(password) or 
        valid_master_password?(password, self.organization.admin_user.encrypted_password) 
    super 
    end 
    ... 
end 

我還在Devise Wiki描述這一點。

如果你只需要開發一個主密碼,然後它更容易使用此代碼:

class User 
    ... 
    def valid_password?(password) 
    return true if Rails.env.development? and password == "THE_MASTER_PASSWORD" 
    super 
    end 
end 
+0

加載DEFAULT_MASTER_USER時沒有問題,因爲您在進行查詢時尚未定義用戶關係? – 2014-12-03 12:08:07

+0

@OleksandrKruk很好的問題。此代碼不會給我任何問題。爲什麼這項工作可能是一個很好的情況下要求在stackoverflow;) – 2014-12-03 13:43:29

+0

@SzymonJeż在這裏我得到錯誤「無法轉換哈希整數 」在這一行DEFAULT_MASTER_USER = self.first(電子郵件:DEFAULT_MASTER_USER_EMAIL)#緩存 – 2016-03-17 11:24:34

2

我實現這個生產,而不得不改變這一行:

DEFAULT_MASTER_USER = self.first(email: DEFAULT_MASTER_USER_EMAIL)

DEFAULT_MASTER_USER = self.find_by(email: DEFAULT_MASTER_USER_EMAIL)

由於它不是通過id查找用戶,而是查找電子郵件地址。