2010-08-16 6 views
2

Je suis actuellement modifié pour utiliser Gem Devise pour l'authentification de l'utilisateur. Mais je ne sais pas comment faire correspondre le cryptage!Problème de chiffrement de mot de passe dans Rails Devise gem

Je savais que nous pouvions écrire un nouveau chiffreur et l'assigner dans les initialiseurs, mais le point est que le chiffreur n'accepte que 4 arguments (mot de passe, étirements, sel, poivre). Mais dans mon cas, j'ai inclus l'email de l'utilisateur et un sel personnalisé dans le cryptage.

Est-il possible de transmettre l'email de l'utilisateur et le sel personnalisé dans le crypteur?

ps. J'utilise database_authenticatable

+0

pourquoi voulez-vous inclure l'email et un sel personnalisé au lieu d'utiliser la manière standard? – Peder

+1

Il y a longtemps et si je me souviens bien de mon cryptage avant de changer pour concevoir utilisé l'email avec un autre sel. Donc, afin de ne pas affecter les utilisateurs, nous devons affiner le cryptage de l'appareil afin qu'il donne le même résultat pour correspondre à l'original. – PeterWong

Répondre

9

Il est triste que personne n'a répondu à ma question ......

Cependant, je pense que je l'ai trouvé la réponse, même si ce n'est pas aussi jolie que je l'imaginais.

d'abord, créez la classe de chiffrement dans les initialiseurs:

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 

En second lieu, remplacer certaines méthodes dans le modèle de l'utilisateur:

# 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 

Et enfin, nous devons enseigner quand chiffrer le mot de passe :

before_save :encrypt_password 
Questions connexes