Django中set_password方法失效:普通用户密码未哈希致登录失败
问题解决:自定义UserManager中普通用户密码未哈希的问题
核心错误点
你的create_user方法里,调用user.set_password(user.password)是错误的。刚创建user对象时,user.password还未被赋值(仅初始化了模型实例,未设置密码),此时应该直接使用方法参数传入的原始password来进行哈希处理。
修改后的manager.py代码
from django.contrib.auth.base_user import BaseUserManager class UserManager(BaseUserManager): def create_user(self, username, phone_number, password, **extra_fields): if not phone_number: raise ValueError('Phone number must be set!') user = self.model(username=username, phone_number=phone_number, **extra_fields) # 使用传入的原始password参数进行哈希 user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, phone_number, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(username, phone_number, password, **extra_fields)
补充说明
- 调用
user.set_password(password)时,Django会自动对原始密码进行哈希,再将哈希值存入用户的password字段,这是处理用户密码的标准方式。 - 之前的错误写法会导致普通用户密码未被正确哈希,而超级用户看似正常是因为创建流程的间接触发,但本质逻辑错误。
- 额外优化:用户模型中的
REQUIRED_FIELDS无需包含password,因为create_user方法已强制要求传入密码,createsuperuser命令也会自动提示输入密码,可修改为REQUIRED_FIELDS = ['phone_number']。
内容的提问来源于stack exchange,提问作者Ali Baghani
相关产品推荐
相关产品推荐

