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

Django如何从MySQL的自定义admin_users表完成用户身份认证

问题原因

Django 内置的 authenticate() 方法默认只会校验官方自带的 auth_user 用户表,你自定义的 AdminUsers 模型没有接入Django的认证体系,因此调用认证方法时不会查询你自己的admin_users表,自然返回None。你能正常打印AdminUsers.objects.all()是因为直接操作自定义模型查询数据,和Django默认认证逻辑无关。

解决方案

这里提供两种适配方案,新手推荐使用第一种:

方案1:直接使用Django自带用户认证体系(门槛最低)

Django 内置的User模型已经包含用户名、密码、邮箱、姓名等常用字段,无需自己定义用户模型:

  • 删除你自己写的AdminUsers模型
  • 创建用户时不要直接操作数据库存明文密码,必须调用User.objects.create_user(username=用户名, password=密码, email=邮箱)方法,该方法会自动对密码做哈希加密存储
  • 原有authenticate()调用逻辑不需要修改,即可正常返回用户对象

方案2:将自定义AdminUsers接入Django认证体系

如果你必须使用自定义的用户表,按以下步骤修改:

  1. 修改models.py的AdminUsers类,继承Django认证要求的基类:
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.db import models

class AdminUsers(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=50, unique=True)
    firstname = models.CharField(max_length=50)
    department = models.CharField(max_length=50)
    mail = models.CharField(max_length=50)
    is_staff = models.BooleanField(default=False) # 用于后台登录权限判断
    is_active = models.BooleanField(default=True) # 标记用户是否可用
    
    # 指定登录时用username作为唯一校验字段
    USERNAME_FIELD = 'username'
    # 创建超级用户时需要额外填写的字段
    REQUIRED_FIELDS = ['mail']

    class Meta:
        db_table = "admin_users"
  1. 在settings.py中添加配置,指定自定义用户模型:
AUTH_USER_MODEL = 'myapp.AdminUsers'
  1. 执行迁移命令更新数据库表结构:
python manage.py makemigrations
python manage.py migrate
  1. 后续创建用户必须调用AdminUsers.objects.create_user()方法,禁止直接存明文密码,否则认证时会因为加密规则不匹配返回None。如果你的admin_users表里已有手动存储的明文密码,需要删除后用上述方法重新创建。
额外排查点
  • 检查前端表单的提交方式为POST,用户名、密码输入框的name属性必须和request.POST中取的键完全一致,不能有拼写错误
  • 确认你要校验的用户确实存在,密码输入正确

内容的提问来源于stack exchange,提问作者anonymous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:39:02