Django-DRF,认证组件

89 阅读1分钟

认证组件

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 2e100e726b390779f50ed3f1c2e2ac3.png

b7bad0464ee81e9721d058a23edf7fd.png

d4135c3ce157956b03e50fe0885ccbe.png

认证类的内部就是去执行: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.类名",]
}

源码流程:

认证组件源码分析.png