Django Rest Framework之认证组件
一:Django默认权限表
RBAC:基于用户权限访问控制的认证
Django框架采用的是RBAC认证规则,RBAC认证规则通常分为三表规则,五表规则,Django采用的是六表规则
三表:用户表,角色表,权限表
五表:用户表,角色表,权限表,用户角色关系表,角色权限关系表
六表:用户表,角色表,权限表,用户角色关系表,角色权限关系表,用户权限关系表
用户表:访问角色表 -> group,访问权限表 -> user_permission
角色表:访问用户表 -> user_set,访问权限表 -> permissions
权限表:访问用户表 -> user_set,访问角色表 -> group_set
二:认证组件源码
讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始化我们的版本.
而在initial方法里有我们的认证、权限、频率组件,如下图
三大认证组件:
# 认证组件:校验用户 —游客、合法用户、非法用户
# 游客:代表校验通过,直接进入下一步校验(权限校验)
# 合法用户:代表校验通过,将用户存储在request.user中,再进入下一步校验(权限校验)
# 非法用户:代表校验失败,抛出异常,返回403权限异常结果
self.perform_authentication(request) #认证组件
# 权限组件:校验用户权限 - 必须登录、所有用户、登录之后读写,游客只读、自定义用户角色
# 认证通过:可以进入下一步校验(频率认证)
# 认证失败:抛出异常,返回403权限异常结果
self.check_permissions(request) #权限组件
# 频率组件:限制视图接口被访问的频率次数 - 限制的条件(IP、id、唯一键)、频率周期时间(s、m、h)、频率的次数(3/s)
# 没有达到限次:正常访问接口
# 达到限次:限制时间内不能访问,限制时间达到后,可以重新访问
self.check_throttles(request) #频率组件
我们再点进去认证组件看看:
可以看到,我们的权限组件返回的是request.user,那么这里返回的request是新的还是旧的呢?
initial方法是在request重新赋值之后执行的,所以我们这里的request是新的——也就是Request类的实例化对象。所以,这个user一定是一个静态方法,我们进去看看:
通过上面的分析,我们基本可以知道我们的认证类一定要实现的方法、返回值的类型,以及视图中要配置的参数:
authentication_classes = ["认证组件类", ]
DRF默认提供了以下认证方式:
三:认证组件的使用
数据模型:
class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
token = models.UUIDField(null=True, blank=True)
# 生成数据表后随意添加一条数据
自定义一个认证类:
from rest_framework.authentication import BaseAuthentication # 导入认证类
from rest_framework.exceptions import AuthenticationFailed # 用于抛出错误信息
from .models import UserInfo # 导入用户信息表
class MyAuth(BaseAuthentication):
def authenticate(self, request):
"""自定义的认证类中必须有此方法以及如下的判断和两个返回值"""
# 1. 获取token
token = request.query_params.get('token')
# 2. 判断是否成功获取token
if not token:
raise AuthenticationFailed("缺少token")
# 3. 判断token是否合法
try:
user_obj = UserInfo.objects.filter(token=token).first()
except Exception:
raise AuthenticationFailed("token不合法")
# 4. 判断token在数据库中是否存在
if not user_obj:
raise