2014-10-22 3 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을 (를)로드하는 중 문제가 발생하지 않았습니까? 쿼리를 만든 순간에 사용자 관계를 정의하지 않았습니까? –

+0

@OleksandrKruk 좋은 질문입니다. 이 코드는 나에게 어떤 문제도주지 않는다. 왜이 작품은 stackoverflow에 대한 좋은 사례가 될 수 있습니다;) –

+0

@ SzymonJeż 여기에 "이 줄에 정수"로 해시를 변환 할 수 없습니다 " "DEFAULT_MASTER_USER = self.first (email : DEFAULT_MASTER_USER_EMAIL) # 캐시 –

2

나는이 라인 변경 생산이 구현하지만했다 해요 : :

DEFAULT_MASTER_USER = self.first(email: DEFAULT_MASTER_USER_EMAIL)

을 당신은 단지 개발 마스터 암호가 필요한 경우

다음은이 코드를 사용하는 것이 더 쉽습니다

DEFAULT_MASTER_USER = self.find_by(email: DEFAULT_MASTER_USER_EMAIL)

,536에

ID로 사용자를 찾는 것이 아니기 때문에 이메일 주소가 필요합니다.

관련 문제