Django+PostgreSQL登录认证功能异常问题求助
Django登录认证失效问题解决方案
核心问题分析
- Django的
authenticate()函数默认仅识别自带的django.contrib.auth.models.User模型,你自定义的UsersPass模型不在认证系统的识别范围内,因此无论输入是否正确都会返回None。 - 你的
UsersPass模型中密码以明文存储,而Django认证系统要求密码必须经过哈希加密,明文密码无法通过验证逻辑。
解决方案一:使用Django自带User模型(快速修复)
1. 替换自定义模型
删除UsersPass模型,直接使用Django内置的User模型。如果需要扩展用户字段,可通过OneToOneField关联自定义扩展模型。
2. 正确创建用户(生成哈希密码)
禁止手动在数据库插入明文密码,使用Django提供的方法创建用户:
# 命令行创建普通用户或超级用户 python manage.py createsuperuser # 或代码中创建 from django.contrib.auth.models import User user = User.objects.create_user(username='你的用户名', password='你的密码') user.save()
3. 保留原登录视图
原views.py中的user_login函数无需修改,authenticate()会自动适配内置User模型完成验证。
解决方案二:自定义认证模型(适合需扩展用户字段场景)
如果必须使用自定义用户模型,需让模型继承认证基类并配置系统识别:
1. 修改models.py
from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin # 自定义用户管理器,负责生成哈希密码 class UserManager(BaseUserManager): def create_user(self, username, password=None, **extra_fields): if not username: raise ValueError('用户名不能为空') user = self.model(username=username, **extra_fields) user.set_password(password) # 自动哈希加密密码 user.save(using=self._db) return user def create_superuser(self, username, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(username, password, **extra_fields) # 自定义用户模型,继承认证基类 class UsersPass(AbstractBaseUser, PermissionsMixin): id_user = models.IntegerField(primary_key=True) username = models.CharField(max_length=50, unique=True) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) objects = UserManager() USERNAME_FIELD = 'username' # 指定登录标识字段 def __str__(self): return self.username
2. 配置settings.py
添加一行指定自定义用户模型:
AUTH_USER_MODEL = 'Application.UsersPass' # 格式:应用名.模型名
3. 重新迁移数据库
python manage.py makemigrations python manage.py migrate
4. 创建自定义用户
from Application.models import UsersPass user = UsersPass.objects.create_user(username='test', password='123456') user.save()
5. 保留原登录视图
authenticate()会自动适配自定义模型完成验证,无需修改登录代码。
额外注意事项
- 永远不要手动存储明文密码,必须通过
set_password()方法生成哈希值。 - 若已存在旧数据库表,修改用户模型后需重新迁移,开发环境可清空数据库后重新初始化。
内容的提问来源于stack exchange,提问作者szym3k33
相关产品推荐
相关产品推荐

