Django DRF中authenticate持续返回None问题排查求助
Django DRF authenticate返回None的问题排查与解决
核心问题分析
自定义用户模型未适配Django认证体系
你的user_auth模型直接继承自models.Model,没有继承Django认证系统要求的AbstractBaseUser或AbstractUser,而authenticate方法默认依赖这些基类提供的密码验证逻辑(比如check_password方法)。密码字段长度不足导致哈希值被截断
数据库中password字段设置为max_length=15,但Django的make_password生成的哈希密码长度远超过15位(通常是128位左右),这会导致存储到数据库时密码被截断,后续验证时自然无法匹配。未配置自定义用户模型为系统默认
即使修改了模型,若不在settings.py中指定AUTH_USER_MODEL,Django认证系统依然会使用内置的User模型,导致authenticate找不到你的自定义用户。
分步解决方案
1. 修改自定义用户模型
更新models.py,让模型继承认证基类并配置必要属性:
from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin class UserAuthManager(BaseUserManager): def create_user(self, name, email, password=None, **extra_fields): if not email: raise ValueError('Users must have an email address') if not name: raise ValueError('Users must have a name') user = self.model( email=self.normalize_email(email), name=name, **extra_fields ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, name, email, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(name, email, password, **extra_fields) class user_auth(AbstractBaseUser, PermissionsMixin): name = models.CharField(max_length=80, unique=True) email = models.EmailField(unique=True) password = models.CharField(max_length=128) # 至少设置128位长度 created = models.DateField(auto_now_add=True) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) USERNAME_FIELD = 'name' # 设置用name作为登录用户名 REQUIRED_FIELDS = ['email'] objects = UserAuthManager()
2. 在settings.py中配置自定义用户模型
添加以下配置:
AUTH_USER_MODEL = '你的app名称.user_auth' # 替换成你的app实际名称
3. 更新序列化器
修改serializer.py,使用模型管理器的create_user方法来创建用户,确保密码正确哈希:
def create(self, validated_data): user = user_auth.objects.create_user( email=validated_data['email'], name=validated_data['name'], password=validated_data['password'] ) return user
4. 重新迁移数据库
因为修改了模型结构,需要重新生成迁移文件并执行:
python manage.py makemigrations python manage.py migrate
注意:如果是已上线的项目,要处理好数据迁移避免丢失数据;测试环境可清空数据库后重新迁移。
5. 验证登录逻辑
你的views.py中的登录逻辑可以保持不变,现在authenticate应该能正确找到并验证你的自定义用户了。
额外说明
- 若不想完全重构用户模型,也可以自定义认证后端,重写
authenticate方法适配你的user_auth模型,但这种方式不如遵循Django认证规范稳妥。 - 测试时请使用新创建的用户(旧用户的密码已被截断,无法正常验证)。
内容的提问来源于stack exchange,提问作者the_yaz2000
相关产品推荐
相关产品推荐

