2010-08-16 5 views
2

이제 사용자 인증을 위해 Gem Devise를 사용하도록 변경되었습니다. 그러나 나는 어떻게 암호화를 일치 시킬지 모른다!Rails Devise gem에서 암호 암호화 문제

우리는 새로운 암호기를 작성하여 이니시에이터에 지정할 수 있다는 것을 알고 있었지만 요점은 encryptor가 4 개의 인수 (암호, 뻗기, 소금, 후추) 만 허용한다는 것입니다. 하지만 제 경우에는 암호화에 사용자의 전자 메일과 사용자 지정 소금을 포함 시켰습니다.

사용자의 이메일과 맞춤식 소금을 암호화기에 전달할 수 있습니까?

ps. 나는 그러나 database_authenticatable

+0

왜 표준 방법 대신 전자 메일과 사용자 지정 소금을 포함 하시겠습니까? – Peder

+1

오래 전이었고, 기억이 잘된다면 암호를 변경하기 전에 암호화를 사용하여 이메일에서 다른 소금을 사용했습니다. 따라서 사용자에게 영향을 미치지 않으려면 암호화 된 암호화를 원래의 암호화와 동일한 결과를 얻을 수 있도록 미세 조정해야합니다. – PeterWong

답변

9

그것은 아무도 내 질문에 대답 없다는 슬픈 ......

를 사용하고 그것은 내가 상상처럼 예쁜 아니다 있지만, 내가 답을 찾은 것 같아요.

첫째, 이니셜 암호화 클래스 생성 : 암호를 암호화 할 때 가르 칠

# overwrite this method so that we call the encryptor class properly 
def encrypt_password 
    unless @password.blank? 
    self.password_salt = self.class.encryptor_class.salt(email) 
    self.encrypted_password = self.class.encryptor_class.digest(@password, self.password_salt) 
    end 
end 

# Because when the database_authenticatable wrote the following method to regenerate the password, which in turn passed incorrect params to the encrypt_password, these overwrite is needed! 
def password=(password) 
    @password = password 
end 
def password_digest(pwd) 
    self.class.encryptor_class.digest(pwd, self.password_salt) 
end 

그리고 마지막으로, 우리가 가진 : 사용자 모델에서 몇 가지 방법을 덮어, 둘째

module Devise 
    module Encryptors 
    class MySha1 < Base 
     def self.digest(password, salt) 
     Digest::SHA1.hexdigest("#{salt}-----#{password}") 
     end 

     def self.salt(email) 
     Digest::SHA1.hexdigest("#{Time.now}-----#{email}") 
     end 
    end 
    end 
end 

을 :

before_save :encrypt_password