Django Rest Framework之认证组件

本文详细介绍了Django Rest Framework中的认证组件,包括Django默认的RBAC权限模型,认证组件源码解析,以及TokenAuthentication和JWT的使用。重点讲述了JWT的工作原理、优缺点和在前后端分离中的作用,包括设置过期时间和自定义验证。
摘要由CSDN通过智能技术生成

一:Django默认权限表

RBAC:基于用户权限访问控制的认证
Django框架采用的是RBAC认证规则,RBAC认证规则通常分为三表规则,五表规则,Django采用的是六表规则
三表:用户表,角色表,权限表
五表:用户表,角色表,权限表,用户角色关系表,角色权限关系表
六表:用户表,角色表,权限表,用户角色关系表,角色权限关系表,用户权限关系表
Django Rest Framework之认证组件
用户表:访问角色表 -> group,访问权限表 -> user_permission
角色表:访问用户表 -> user_set,访问权限表 -> permissions
权限表:访问用户表 -> user_set,访问角色表 -> group_set

二:认证组件源码

讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始化我们的版本.
而在initial方法里有我们的认证、权限、频率组件,如下图
Django Rest Framework之认证组件
三大认证组件:

# 认证组件:校验用户 —游客、合法用户、非法用户
# 游客:代表校验通过,直接进入下一步校验(权限校验)
# 合法用户:代表校验通过,将用户存储在request.user中,再进入下一步校验(权限校验)
# 非法用户:代表校验失败,抛出异常,返回403权限异常结果
self.perform_authentication(request)  #认证组件
# 权限组件:校验用户权限 - 必须登录、所有用户、登录之后读写,游客只读、自定义用户角色
# 认证通过:可以进入下一步校验(频率认证)
# 认证失败:抛出异常,返回403权限异常结果
self.check_permissions(request)   #权限组件
# 频率组件:限制视图接口被访问的频率次数 - 限制的条件(IP、id、唯一键)、频率周期时间(s、m、h)、频率的次数(3/s)
# 没有达到限次:正常访问接口
# 达到限次:限制时间内不能访问,限制时间达到后,可以重新访问
self.check_throttles(request)   #频率组件

我们再点进去认证组件看看:
Django Rest Framework之认证组件
可以看到,我们的权限组件返回的是request.user,那么这里返回的request是新的还是旧的呢?
initial方法是在request重新赋值之后执行的,所以我们这里的request是新的——也就是Request类的实例化对象。所以,这个user一定是一个静态方法,我们进去看看:
Django Rest Framework之认证组件
Django Rest Framework之认证组件
通过上面的分析,我们基本可以知道我们的认证类一定要实现的方法、返回值的类型,以及视图中要配置的参数:

authentication_classes = ["认证组件类", ]

DRF默认提供了以下认证方式:
Django Rest Framework之认证组件

三:认证组件的使用

数据模型:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值