Django覆盖默认用户模型后新建超级用户无法登录如何解决
问题根因
你的UserProfileManager的create_user方法没有对密码做哈希加密处理,直接将明文密码存入了数据库。Django的身份校验逻辑会自动对用户输入的密码做哈希运算后再和数据库存储的哈希值对比,明文存储的密码永远无法通过校验,这就是你提示账号密码错误的核心原因。
修复方案
1. 修改自定义用户管理器的create_user方法
把直接赋值password = password的逻辑删除,改为调用set_password()方法,这个方法会自动完成密码的哈希加密:
def create_user(self, email, first_name, last_name, password=None): if not email: raise ValueError("Email is required") user = self.model( email = self.normalize_email(email), first_name = first_name, last_name = last_name ) # 新增set_password调用完成密码加密 user.set_password(password) user.save(using=self._db) return user
2. 重建数据库与超级用户
修改代码后,删除旧的数据库文件、所有app下的migrations目录里除了__init__.py之外的文件,重新执行迁移并创建新的超级用户:
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
3. 验证修复
重启服务后使用新创建的超级用户账号登录后台,即可正常登录。
注意:后续所有修改用户密码的业务代码,都要使用
set_password()方法,不能直接给password字段赋值,否则会重复出现密码校验失败的问题。
内容的提问来源于stack exchange,提问作者Yespa16
相关产品推荐
相关产品推荐

