主要分为两种情况
一、数据的密码加密问题
对于数据库表进行数据创建时使用model类进行正常数据创建,导致数据库表内密码为明文,但是authenticate()查找数据会自动加密,因此应该使用User.objects.create_user(username=username,password=password)进行数据创建。
二、数据查找异常
可能很多小伙伴都是在model里面创建一个类继承AbstractUser类进行数据迁移,然后创建数据也是往该表单内提交数据。因此,使用anthenticate()会导致查找不到数据。因为,该函数是默认查找auth_user表单,但是该表单没有存储数据因此一直返回none。
对待这个需要进行authenticate()函数的重写,使得它查找自己创建的数据库内的表单数据。同时,authenticate()函数也只能进行username和password的校验。因此,重构可以进行扩充自定义的校验。
是的,在 Django 中,`authenticate()` 函数默认是从 `auth_user` 表中获取数据进行认证。`auth_user` 表是由 Django 的 `auth` 应用中的 `User` 模型生成的,默认用于存储用户信息。
### `authenticate()` 函数的工作原理
1. **默认认证后端**:
- `authenticate()` 函数使用 Django 的默认认证后端 `ModelBackend`,该后端从 `auth_user` 表中查询用户数据。
- `ModelBackend` 会根据提供的 `username` 和 `password` 进行验证。如果用户名和密码匹配,并且用户是激活状态(`is_active` 为 `True`),则返回对应的 `User` 对象;否则返回 `None`。
2. **自定义认证后端**:
- 如果你有自定义的认证需求,可以创建自定义认证后端,并在 `settings.py` 中配置 `AUTHENTICATION_BACKENDS`。
- 自定义认证后端可以扩展或修改默认的认证逻辑,例如支持邮箱登录、多因素认证等。
### 示例:自定义认证后端
如果你需要支持邮箱登录,可以创建一个自定义认证后端:
在你的app下面创建一个py文件
# myapp/backends.py
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q
from myapp.models import User#导入你的类
class Identity(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = User.objects.get(Q(username=username) | Q(password=password))#设置校验条件
print("user的值{}",user)
if user.check_password(password) and user.is_active:
return user
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
在 `settings.py` 中配置自定义认证后端:
AUTHENTICATION_BACKENDS = [
'myapp.authenticate函数.authenticates.Identity',#你自己定义的authenticate函数类的路径
#Identity为我的类名
'django.contrib.auth.backends.ModelBackend',
]
使用自定义认证后端进行认证:
from django.contrib.auth import authenticate
username = 'admin@example.com' # 可以是用户名或邮箱
password = '12341'
user = authenticate(username=username, password=password)
if user is not None:
print("登录成功!")
else:
print("登录失败,用户名或密码错误!")
### 总结
- **默认认证**:`authenticate()` 函数默认从 `auth_user` 表中获取数据进行认证。
- **自定义认证后端**:可以通过创建自定义认证后端来扩展或修改认证逻辑,支持更多认证方式。