我有一个遗留用户数据库,我想将其集成到一个新的Django项目中。
用户密码使用简单的MD5加密(PHP md5()函数)保存在旧数据库中,无需任何腌制。
覆盖django.contrib.auth的check_password和set_password不是一个选项,因为我已经在新的Django项目中激活了新用户。
查看passlib,但不幸的是,它没有完成在此特定项目上需要完成的工作。
所以基本上,我唯一的选择是以某种方式将哈希转换为Django salted格式,或者实现自定义check_password方法,这将确定密码是普通MD5还是django密码(甚至可能是我的自定义中的参数)用户模型,类似于legacy=True
布尔标志)。
非常感谢任何帮助。
答案 0 :(得分:7)
Django contrib.auth.hashers
module 已经支持简单,无保留的MD5密码:
# Ancient versions of Django created plain MD5 passwords and accepted
# MD5 passwords with an empty salt.
if ((len(encoded) == 32 and '$' not in encoded) or
(len(encoded) == 37 and encoded.startswith('md5$$'))):
algorithm = 'unsalted_md5'
因此,如果您的哈希值为32(哈希值的十六进制表示),并且不包含$
个字符(这表示存在哈希签名前缀),则或 hash长度为37个字符,以md5$$
开头,然后您的哈希已经支持。
更好:任何成功进行身份验证的用户都会将其密码哈希自动更新为当前首选方案。您的用户将自己迁移您的数据库。
答案 1 :(得分:1)
在这些情况下,我建议你采取不同的方法。
1)创建自己的身份验证后端。
2)在该后端实现与php项目相同的密码验证系统。
3)比较后端的哈希密码,就像django身份验证后端一样。
4)认证成功后,用django方法设置用户密码,这样就会使用默认的django认证逻辑。
5)登录用户。