Django哈希密码存储正常 姓名拼接密码登录失败问题
故障原因
密码校验失败是重复对密码做哈希处理导致的:
- Django内置的
create_user方法自带密码哈希逻辑,传入password参数的明文会被方法内部自动调用make_password处理后存入数据库 - 现有代码先手动将拼接得到的明文密码做了一次
make_password哈希,再将生成的哈希串传入create_user,方法内部会对这个哈希串再做一次哈希,最终数据库中存储的是两次哈希后的结果 - 登录校验时,Django认证逻辑只会将用户输入的明文密码做一次哈希后和库中存储值比对,一次哈希结果和两次哈希结果无法匹配,自然校验不通过。
修复方案
优先选择符合Django设计规范的写法:删除手动调用的make_password,直接将拼接后的明文密码传入create_user即可。建议额外加strip()去除用户输入首尾可能存在的空格,避免生成的密码和用户预期不一致,调整后代码如下:
if add_form.is_valid(): post = request.POST new_password = post['first_name'].strip() + post['last_name'].strip() new_user = Profile.objects.create_user( email = post['email'], password = new_password, first_name = post['first_name'], last_name = post['last_name'], phone_number = post['phone_number'], ) new_user.save() return redirect('add')
如果确实需要手动调用make_password处理密码,就不要使用create_user方法,改用Profile.objects.create()创建用户,避免触发内置的二次哈希逻辑,但这种写法容易遗漏create_user内置的用户字段规范化校验,非必要不使用。
内容的提问来源于stack exchange,提问作者Arundeep Chohan
相关产品推荐
相关产品推荐

