2011-11-09 13 views
1

現在、私はレールに移行する必要があるdjangoのシステムを持っています。私はDeviseをレールの認可に使用しています。古いdjangoシステムには、私がレールに移行する必要のある独自のユーザがあります。私が懸念しているのは、ユーザーのパスワードです。 sha1アルゴリズムを使用して暗号化されています。それで、古いユーザーのパスワードと互換性があるように、私はどのように変更することができますか。djangoユーザーをレールに移行

答えて

2

各ユーザーが独自のランダムな塩を取得します。パスワードが設定されたテーブルが漏洩すると、実際のパスワードを取得するのに役立ちます。

チェックアウトdjango/contrib/auth.models.pycheck_password(raw_password, enc_password)はあなたのRailsの認証システムに実装するために必要なものです:

def get_hexdigest(algorithm, salt, raw_password): 
    """ 
    Returns a string of the hexdigest of the given plaintext password and salt 
    using the given algorithm ('md5', 'sha1' or 'crypt'). 
    """ 
    raw_password, salt = smart_str(raw_password), smart_str(salt) 
    if algorithm == 'crypt': 
     try: 
      import crypt 
     except ImportError: 
      raise ValueError('"crypt" password algorithm not supported in this environment') 
     return crypt.crypt(raw_password, salt) 

    if algorithm == 'md5': 
     return md5_constructor(salt + raw_password).hexdigest() 
    elif algorithm == 'sha1': 
     return sha_constructor(salt + raw_password).hexdigest() 
    raise ValueError("Got unknown password algorithm type in password.") 

def check_password(raw_password, enc_password): 
    """ 
    Returns a boolean of whether the raw_password was correct. Handles 
    encryption formats behind the scenes. 
    """ 
    algo, salt, hsh = enc_password.split('$') 
    return constant_time_compare(hsh, get_hexdigest(algo, salt, raw_password)) 
1

私は私のユーザモデルで、次の方法があります。

def valid_password?(pwd) 
    begin 
     super(pwd) 
    rescue 
     my_pwds = self.encrypted_password.split '$' 
     Digest::SHA1.hexdigest(my_pwds[1] + pwd) == my_pwds[2] rescue false 
    end 
end 

これはdefault_passwordを拡張しますか?メソッドを使用して、ユーザーが正しいパスワードを送信したかどうかを確認します。最初に、通常のdevise論理を使ってユーザがチェックされており、それが動作しない場合、Django sha1ロジックが実行されます。この方法ではパスワードもサポートされているので、将来は互換性の問題は発生しません。