django restframework
- 快速上手
- 请求的封装
- 版本管理
- 认证
- 权限
- 限流
- 序列化
- 视图
- 条件搜索
- 分页
- 路由
- 解析器
认证
可以定义继承baseauthentication的ayth认知类,然后在authentication_classes中添加。
auth类中有两个方法:authenticate和authenticate_header。一个定义auth逻辑,返回(user, token),一个定义错误是的返回信息
在开发后端的API时,不同的功能会有不同的限制,例如:
- 无需认证,就可以访问并获取数据。
- 需认证,用户需先登录,后续发送请求需携带登录时发放的凭证(后期会讲jwt)
在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)
token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True)
在视图类中设置类变量 authentication_classes
的值为 认证类 MyAuthentication
,表示此视图在执行内部功能之前需要先经过 认证。
认证类的内部就是去执行:authenticate
方法,根据返回值来表示认证结果。
-
抛出异常AuthenticationFailed,表示认证失败。内部还会执行
authenticate_header
将返回值设置给响应头WWW-Authenticate
-
返回含有两个元素的元组,表示认证成功,并且会将元素的第1个元素赋值给
request.user
、第2个值赋值给request.auth
。第1个值,一般是用户对象。 第2个值,一般是token
-
返回None,表示继续调用 后续的认证类 进行认证(上述案例未涉及)
**关于 ”返回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, }
”返回None“的应用场景:
当某个API,已认证 和 未认证 的用户都可以方法时,比如:
- 已认证用户,访问API返回该用户的视频播放记录列表。
- 未认证用户,访问API返回最新的的视频列表。
注意:不同于之前的案例,之前案例是:必须认证成功后才能访问,而此案例则是已认证和未认证均可访问。
关于多个认证类
多个认证类时:前面的认证类可以在可以通过返回None来执行下一个认证类,最后验证失败时要抛出异常
一般情况下,编写一个认证类足矣。
当项目中可能存在多种认证方式时,就可以写多个认证类。例如,项目认证支持:
- 在请求中传递token进行验证。
- 请求携带cookie进行验证。
- 请求携带jwt进行验证(后期讲)。
- 请求携带的加密的数据,需用特定算法解密(一般为app开发的接口都是有加密算法)
- …
此时,就可以编写多个认证类,并按照需要应用在相应的视图中,例如:
注意:此示例后续在视图中读取的 request.user
的值为None时,表示未认证成功;不为None时,则表示认证成功。
全局配置
在每个视图类的类变量 authentication_classes
中可以定义,其实在配置文件中也可以进行全局配置,例如:
REST_FRAMEWORK = {
"UNAUTHENTICATED_USER": lambda: None,
"UNAUTHENTICATED_TOKEN": lambda: None,
"DEFAULT_AUTHENTICATION_CLASSES":["xxxx.xxxx.xx.类名","xxxx.xxxx.xx.类名",]
}
底层源码实现:
小结
- 认证组件,在视图执行之前判断用户是否认证成功。
- 过程:执行所有的认证类中的
authenticate
方法- 返回None,继续执行后续的认证类(都未认证成功,request.user 和 auth有默认值,也可以全局配置)
- 返回2个元素的元组,中断
- 抛出
AuthenticationFailed
,中断
- 结果:在
request.user
和request.auth
赋值(后续代码可以使用)
- 过程:执行所有的认证类中的
若有错误与不足请指出,关注DPT一起进步吧!!!