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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:52:05