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

Django DRF中authenticate持续返回None问题排查求助

Django DRF authenticate返回None的问题排查与解决

核心问题分析

  1. 自定义用户模型未适配Django认证体系
    你的user_auth模型直接继承自models.Model,没有继承Django认证系统要求的AbstractBaseUser或AbstractUser,而authenticate方法默认依赖这些基类提供的密码验证逻辑(比如check_password方法)。

  2. 密码字段长度不足导致哈希值被截断
    数据库中password字段设置为max_length=15,但Django的make_password生成的哈希密码长度远超过15位(通常是128位左右),这会导致存储到数据库时密码被截断,后续验证时自然无法匹配。

  3. 未配置自定义用户模型为系统默认
    即使修改了模型,若不在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:32:40