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

Django自定义用户模型登录失败:密码未哈希问题求助

问题根源与修复方案

核心问题分析

你的代码存在两个关键问题导致密码未被哈希:

  1. 自定义用户模型重复定义password字段:AbstractBaseUser已经内置了密码管理逻辑(包括哈希存储),你手动添加的password = models.CharField(...)会覆盖原有逻辑,导致set_password()无法正确生成哈希值。
  2. 超级用户创建方法参数顺序错误:create_superuser调用create_user时,参数顺序搞反了,把password和username位置互换,导致实际传入的密码值错误,哈希逻辑未生效。

具体修复步骤

1. 修复CustomUser模型

删除手动定义的password字段,保留AbstractBaseUser提供的密码管理:

class CustomUser(AbstractBaseUser):
    username = models.CharField(max_length=100, unique=True)
    # 移除下面这行手动定义的password字段
    # password = models.CharField(max_length=100, null=True, default='')
    email = models.EmailField(unique=True)
    coins = models.ManyToManyField('Coin', through='UserCoin')
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

2. 修复CustomUserManager中的create_superuser方法

修正调用create_user时的参数顺序,确保password传入正确位置:

def create_superuser(self, email=None, username=None, password=None, **extra_fields):
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_superuser', True)

    if extra_fields.get('is_staff') is not True:
        raise ValueError('Superuser must have is_staff=True.')
    if extra_fields.get('is_superuser') is not True:
        raise ValueError('Superuser must have is_superuser=True.')
    if email is None:
        raise ValueError('The Email field must be set for superuser.')

    # 修正参数顺序:email, username, password 对应create_user的参数列表
    return self.create_user(email, username, password, **extra_fields)

3. 验证注册逻辑(关键)

确保你注册用户时使用的是CustomUser.objects.create_user()方法,而不是直接创建CustomUser实例并赋值password。例如:

# 正确的注册方式
user = CustomUser.objects.create_user(
    email='user@example.com',
    username='testuser',
    password='yourpassword123'
)

4. 更新数据库与已有用户

  • 生成并应用数据库迁移:
python manage.py makemigrations
python manage.py migrate
  • 对于已存在的未哈希密码的用户,可通过Django Shell重新设置密码:
python manage.py shell
from your_app.models import CustomUser
user = CustomUser.objects.get(username='existing_user')
user.set_password('new_hashed_password')
user.save()

验证登录功能

完成上述修改后,重新注册用户,此时密码会被正确哈希存储。使用登录视图测试,authenticate方法会通过user.check_password()正确验证哈希密码,登录功能即可恢复正常。

内容的提问来源于stack exchange,提问作者Purple_Leprichaun09

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:00:33