Django数据库层密码校验实现及password属性不存在报错修复
问题修复方案
现有代码的两个核心错误
- 字段名拼写错误:代码中写的
registered_user.passwrod存在笔误,正确的用户模型密码字段名为password,这是触发registered_user has no attribute password异常的直接原因。 - 密码校验逻辑错误:Django的
make_password方法每次生成哈希值时会随机生成盐值,相同明文密码多次调用该方法得到的哈希结果完全不同,直接对比哈希值永远无法得到匹配结果,这种校验逻辑本身是错误的。
正确实现方式
- 修正字段拼写错误,将笔误的
passwrod改为password - 废弃现有哈希值直接对比的逻辑,使用Django内置的
check_password方法完成密码校验:该方法会自动适配存储的哈希算法、处理盐值匹配,传入明文密码和数据库存储的密码哈希即可返回准确的布尔型校验结果,同时内置了时序攻击防护,安全性有保障。 - 补充查询异常捕获:
CustomUser.objects.get()在匹配不到对应手机号用户时会抛出DoesNotExist异常,需要捕获该分支走新用户注册流程,避免接口直接报错。
修复后参考代码
from django.contrib.auth.hashers import check_password from django.core.exceptions import ObjectDoesNotExist try: registered_user = CustomUser.objects.get(phone_number=data['phone_number']) if check_password(data['password'], registered_user.password): serializer = UserSerializerWithToken(registered_user, many=False) return Response(serializer.data) # 手机号已存在但密码不匹配分支,可根据业务需求返回对应错误 return Response({"detail": "该手机号已注册,输入密码不正确"}, status=400) except ObjectDoesNotExist: # 未查询到已注册用户,继续执行后续新用户注册逻辑即可 pass
提示:不要自行实现密码哈希、校验逻辑,Django内置的密码处理组件已经覆盖了算法迭代、安全防护等生产环境必要能力,直接调用即可。
内容的提问来源于stack exchange,提问作者atropa belladona
相关产品推荐
相关产品推荐

