You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:30:56