Django自定义用户模型登录失败:密码未哈希问题求助
问题根源与修复方案
核心问题分析
你的代码存在两个关键问题导致密码未被哈希:
- 自定义用户模型重复定义password字段:
AbstractBaseUser已经内置了密码管理逻辑(包括哈希存储),你手动添加的password = models.CharField(...)会覆盖原有逻辑,导致set_password()无法正确生成哈希值。 - 超级用户创建方法参数顺序错误:
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
相关产品推荐
相关产品推荐

