Django自定义用户模型后使用合法邮箱密码无法登录如何解决
问题排查与解决方案
核心问题:注册表单未处理密码加密,明文存储密码
你当前使用的RegisterForm是Django ModelForm,默认的save()方法会直接把表单提交的明文密码写入数据库的password字段。而Django的身份校验逻辑会将用户登录时输入的密码哈希后,再与数据库存储的哈希值对比,明文密码永远无法匹配校验规则,因此一直返回「用户名或密码无效」的错误。
修复方法:重写注册表单的save方法
在RegisterForm类中添加如下save方法,手动调用set_password对密码做哈希加密后再存储:
class RegisterForm(forms.ModelForm): # 原有代码保持不变 ... # 新增save方法 def save(self, commit=True): user = super().save(commit=False) # 对明文密码做哈希加密 user.set_password(self.cleaned_data["password"]) if commit: user.save() return user
其他需要检查的修正点
- 登录视图中
authenticate方法需要传入request参数:Django 1.10及以上版本要求authenticate第一个参数为请求对象,你当前的代码缺少该参数,可能导致校验失败,修改为:# 原有代码 user = authenticate(email=email, password=password) user = authenticate(request, email=email, password=password) - 清理历史测试数据:之前注册的用户密码都是明文存储,修复后需要删除这些历史用户,重新注册账号测试登录。
- 确认认证后端配置:如果你修改过
settings.py中的AUTHENTICATION_BACKENDS配置,确保你使用的认证后端支持以email作为用户名校验,默认的django.contrib.auth.backends.ModelBackend会自动适配你设置的USERNAME_FIELD = 'email',无需额外修改。
内容的提问来源于stack exchange,提问作者Ishan Khaire
相关产品推荐
相关产品推荐

