로그인 할 때 유효한 특정 비밀번호 (소위 마스터 비밀번호 또는 수퍼 패스워드)를 사용하는 모든 사용자로 로그인 할 수있는 메커니즘을 구현하는 방법은 무엇입니까?Devise에서 안전한 Master/Super Password 인증을 구현하는 방법은 무엇입니까?
이것은 관리 및 지원 목적으로 필요합니다.
로그인 할 때 유효한 특정 비밀번호 (소위 마스터 비밀번호 또는 수퍼 패스워드)를 사용하는 모든 사용자로 로그인 할 수있는 메커니즘을 구현하는 방법은 무엇입니까?Devise에서 안전한 Master/Super Password 인증을 구현하는 방법은 무엇입니까?
이것은 관리 및 지원 목적으로 필요합니다.
마스터 암호가 필요한 경우 암호를 소스 코드에 하드 코드하지 말고 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
나는이 라인 변경 생산이 구현하지만했다 해요 : :
DEFAULT_MASTER_USER = self.first(email: DEFAULT_MASTER_USER_EMAIL)
다음은이 코드를 사용하는 것이 더 쉽습니다
DEFAULT_MASTER_USER = self.find_by(email: DEFAULT_MASTER_USER_EMAIL)
ID로 사용자를 찾는 것이 아니기 때문에 이메일 주소가 필요합니다.
DEFAULT_MASTER_USER을 (를)로드하는 중 문제가 발생하지 않았습니까? 쿼리를 만든 순간에 사용자 관계를 정의하지 않았습니까? –
@OleksandrKruk 좋은 질문입니다. 이 코드는 나에게 어떤 문제도주지 않는다. 왜이 작품은 stackoverflow에 대한 좋은 사례가 될 수 있습니다;) –
@ SzymonJeż 여기에 "이 줄에 정수"로 해시를 변환 할 수 없습니다 " "DEFAULT_MASTER_USER = self.first (email : DEFAULT_MASTER_USER_EMAIL) # 캐시 –