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认证体系
如果你必须使用自定义的用户表,按以下步骤修改:
- 修改
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"
- 在
settings.py中添加配置,指定自定义用户模型:
AUTH_USER_MODEL = 'myapp.AdminUsers'
- 执行迁移命令更新数据库表结构:
python manage.py makemigrations python manage.py migrate
- 后续创建用户必须调用
AdminUsers.objects.create_user()方法,禁止直接存明文密码,否则认证时会因为加密规则不匹配返回None。如果你的admin_users表里已有手动存储的明文密码,需要删除后用上述方法重新创建。
额外排查点
- 检查前端表单的提交方式为POST,用户名、密码输入框的
name属性必须和request.POST中取的键完全一致,不能有拼写错误 - 确认你要校验的用户确实存在,密码输入正确
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

