Django自定义用户模型:Shell创建用户无法认证登录问题
自定义用户模型密码认证失败问题:根源与解决办法
问题本质
你的认证逻辑是直接对比user.password == password,但两种创建用户的方式导致密码存储格式完全不同:
- SQL手动创建的用户:密码以明文存储,直接对比能匹配
- Shell用
model_name.objects.create()创建的用户:Django默认会对密码做pbkdf2_sha256哈希加密,存储的是加密串,和明文直接对比必然不相等
解决方案
1. 修正认证逻辑(兼容新旧用户)
替换直接对比密码的代码,改用Django内置的check_password()方法——这个方法会自动判断密码是明文还是加密串,正确完成验证:
原错误代码:
# 直接对比密码(仅能匹配明文存储的用户) user = YourUserModel.objects.get(username=request.POST['username']) if user.password == request.POST['password']: # 执行登录逻辑
修正后代码:
# 兼容明文与加密密码的验证 user = YourUserModel.objects.get(username=request.POST['username']) if user.check_password(request.POST['password']): # 执行登录逻辑
2. 统一密码存储格式(长期推荐)
为了规范密码存储,避免后续问题,可以在修复认证逻辑后,批量将遗留的明文密码转为加密格式:
- 在Django Shell中执行以下脚本:
from your_app.models import YourUserModel for user in YourUserModel.objects.all(): # 筛选出未加密的明文密码(Django加密密码以算法前缀开头) if not user.password.startswith('pbkdf2_sha256$'): user.set_password(user.password) # 自动哈希密码 user.save()
3. 正确创建新用户
后续创建用户时,不要用objects.create()直接设置密码,改用create_user()方法(需要你的自定义用户模型继承AbstractBaseUser并配置UserManager):
# 正确创建用户(自动处理密码哈希) YourUserModel.objects.create_user(username='test_user', password='your_password')
内容的提问来源于stack exchange,提问作者Nipun
相关产品推荐
相关产品推荐

