将django用户迁移到rails

时间:2011-11-09 06:04:23

标签: ruby-on-rails django devise

我目前有一个带django的系统,我需要迁移到rails。我正在使用Devise在rails中进行授权。旧的django系统拥有自己的用户集,我需要迁移到rails。我关心的是用户的密码。它使用sha1算法加密。所以,我如何修改设计,使其与旧用户的密码兼容。

2 个答案:

答案 0 :(得分:2)

每个用户都有自己的随机盐,如果有密码的表被泄露,彩虹表将无法获得实际的密码。

Checkout 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 :(得分: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逻辑。这种方式也支持设计密码,因此将来不会出现兼容性问题。