2010-06-19 6 views
2

Je travaille actuellement sur une application Rails qui stocke des mots de passe clairs (...). Je migre donc vers l'authentification Authlogic avec un chiffrement SHA512 «standard».Migration du stockage de mot de passe clair vers authlogic

je l'ai fait ce qui fonctionne très bien:

#file /models/user.rb 
class User < ActiveRecord::Base 

    acts_as_authentic { |c| 
    c.transition_from_crypto_providers = [MyOwnNoCrypto, Authlogic::CryptoProviders::Sha512] 
    } 
end 

#file /lib/my_own_no_crypto.rb 
class MyOwnNoCrypto 
    def self.encrypt(*tokens) 
    return tokens[0] # or tokens.join I guess 
    end 

    def self.matches?(crypted_password, *tokens) 
    return crypted_password == tokens.join 
    end 
end 

Il est agréable - et fonctionne très bien - mais je me demande s'il y a un moyen plus sexy de le faire, peut-être avec une option de base Authlogic?

Merci!

Répondre

1

Je suis d'accord avec la partie de thomasfedb's answer qui suggère une transition ponctuelle plutôt que d'utiliser le modèle de transition d'AuthLogic. Dans ce cas, vous souhaitez crypter ces mots de passe dès que possible, pas la prochaine fois que l'utilisateur se connecte. Au lieu d'une tâche Rake, je suggère une migration:

# in db/migrate/nnnnnnnn_encrypt_passwords.rb: 

class EncryptPasswords < ActiveRecord::Migration 
    def self.up 
    add_column :users, :crypted_password 
    User.each do |u| 
     u.encrypt_password! 
    end 
    remove_column :users, :password 
    end 

    def self.down 
    raise IrreversibleMigration.new('Cannot decrypt user passwords') 
    end 
end 
+1

Wow! super sympa! Merci beaucoup. –

1

Personnellement, j'écrirais une migration pour migrer tous les mots de passe en texte crypté. Vous pouvez êtrefifite pour définir votre propre modèle dans la migration pour permettre un bon accès de bas niveau.

Questions connexes