认证组件
drf中也给我们提供了认证组件 ,可以帮助我们快速实现认证相关的功能,例如:
# models.py
from django.db import models
class UserInfo(models.Model):
username = models.CharField(verbose_name="用户名", max_length=32)
password = models.CharField(verbose_name="密码", max_length=64)
# 使用uuid生成token,用于测试,项目中使用jwt认证
token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True)
登录成功返回token
认证类的内部就是去执行:authenticate方法,根据返回值来表示认证结果。
- 抛出异常AuthenticationFailed,表示认证失败。内部还会执行
authenticate_header将返回值设置给响应头WWW-Authenticate - 返回含有两个元素的元组,表示认证成功,并且会将元素的第1个元素赋值给
request.user、第2个值赋值给request.auth。 - 返回None,表示继续调用 后续的认证类 进行认证
返回None
在视图类的 authentication_classes 中定义认证类时,传入的是一个列表,支持定义多个认证类。
当出现多个认证类时,drf内部会按照列表的顺序,逐一执行认证类的 authenticate 方法,如果 返回元组 或 抛出异常 则会终止后续认证类的执行;如果返回None,则继续执行后续的认证类。
如果所有的认证类authenticate都返回了None,则默认 request.user="AnonymousUser" 和 request.auth=None,也可以通过修改配置文件来修改默认值。
REST_FRAMEWORK = {
"UNAUTHENTICATED_USER": lambda: None,
"UNAUTHENTICATED_TOKEN": lambda: None,
}
全局配置
在每个视图类的类变量 authentication_classes 中可以定义,也可以通过配置文件进行全局配置,例如:
REST_FRAMEWORK = {
# 列表中编写认证类的路径
"DEFAULT_AUTHENTICATION_CLASSES":["xxxx.xxxx.xx.类名","xxxx.xxxx.xx.类名",]
}
源码流程: