DRF的三大认证组件

认证组件

工作原理

首先,认证组件是基于BaseAuthentication类,并重写authenticate方法.

其认证的规则大概分三个方面:

  1. 如果没有携带认证信息(token),直接返回None,也就是判定登录为游客登录
  2. 如果携带有认证信息,但是校验失败,则会抛出异常,这种情况通常为非法用户,爬虫就属于这一类
  3. 如果有认证信息,且通过校验能够查到数据库中相应的数据,那么就判定登录方为合法用户.

实现

在使用认证组件的时候,我们需要新建一个utils文件夹,然后在其下建立对应的认证组件,权限组件和频率组件,

# /utils/authentications.py
from rest_framework.authentication import BaseAuthentication class TokenAuthentication(BaseAuthentication):
prefix = 'Token'
def authenticate(self, request):
# 这里我们需要通过request来拿到前台传来的的token,字典的key为HTTP_AUTHORIZATION,以get取值
auth = request.META.get('HTTP_AUTHORIZATION')
# 判断拿到的token是否为空,如果为空则返回None
if not auth:
return None
# 如果不为空,切割
auth_list = auth.split()
# 切割完之后判断如果其长度不是2或者第一位的小写不等于之前我们赋予的token字符串,就是非法用户
if not (len(auth_list) == 2 and auth_list[0].lower() == self.prefix.lower()):
raise AuthenticationFailed('非法用户')
# 判断以上两步之后,就是合法用户,我们校验其算法之后,让其登录,或者抛异常
token = auth_list[1] # 校验算法
user = _get_obj(token)
# 校验失败抛异常,成功返回(user, token)
return (user, token)

权限组件

工作原理

权限组件是基于BasePermission类,且重写has_permission方法,该方法字面意思我们也能看懂,就是是否有此权限的意思.

对于权限的判断也只有常见的两种,返回值为True就是要有权限,返回值为False代表无权限.

实现

权限组件的实现与认证权限相似

# /utils/permissions.py
from rest_framework.permissions import BasePermission
class SuperUserPermission(BasePermission):
# 下面我们重写has_permission方法
def has_permission(self, request, view):
# 这里我们判定的是超级用户,即当登录的用户存在且是超级用户的时候权限存在,如果只是判断普通用户的话把and后面的判断条件取消去掉即可
return request.user and request.user.is_superuser

频率组件

工作原理

频率组件起到的作用是限制同一个用户或者IP在一定时间内访问同一接口的次数,其工作原理如下:

  1. 频率组件是基于SimpleRateThrottle,重写的是get_cache_key方法,并设置scope类的属性
  2. scope是一个认证字符串,在配置文件中我们通过配置scope字符串来实现对应的频率设置,scope本身只是一个普通的字符串,只是起到一种提示的作用
  3. get_cache_key方法的返回值是一个字符串,该字符串就是缓存访问次数的缓存key

实现

# /utils/throttles.py
from rest_framework.throttling import SimpleRateThrottle class ThreeTimeUserThrottle(SimpleRateThrottle):
# scope本身没有意义,我们将其定义只是为了提示其真正作用,真正设置频率需要在settings.py文件里面配置
scope = 'three'
# 取到当前用户缓存的key
def get_cache_key(self, request, view):
# 这里的返回值注意,要返回一个跟当前用户相关的值,不能返回一个固定的值,除非是针对游客所定义的频率类
return 'throttle:user_%s' % (request.user.id)

三种组件的配置

三种组件的全局配置如下:

# settings.py
REST_FRAMEWORK = {
# 认证模块
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
], # 权限模块
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
], # 频率设置
'DEFAULT_THROTTLE_RATES': {
# 这里前一个字段时我们在throttles.py文件里定义的scope字段,后面就是真正的频率设置
# 要注意的是,频率设置/后面的部分其实只取到第一个字符,后面的字符都没有作用,只凭第一个字符来从字典里面取值,具体的配置在源码里面,位置为 rest_framework\throttling.py\里面的parse_rate方法,就是解析配置项,默认如下:
# duration_dic = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400},s是每秒秒,m是每分钟,h是每小时,d是每天
'three': '3/min',
},
}

如果需要局部配置的话,只需要在需要使用的views.py文件中相应的方法中加入即可,比如:

class UserCenterAPIView(APIView):
# 认证模块局部配置,为空即是清空配置
authentication_classes = [] # 权限模块局部配置
permission_classes = [IsAuthenticated] # 频率模块局部配置
throttle_classes = [ThreeTimeUserThrottle] def get(self, request, *args, **kwargs):
pass

DRF的三大认证组件的更多相关文章

  1. drf框架 - 三大认证组件 | 认证组件 | 权限组件 | 频率组件

    RBAC 基于用户权限访问控制的认证 - Role-Based Access Control Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则.五表规则,Django采用 ...

  2. 第四章、drf框架 - 三大认证组件 | 认证组件 | 权限组件 | 频率组件

    目录 RBAC 基于用户权限访问控制的认证 - Role-Based Access Control 三大认证组件 源码分析 一.认证组件 自定义认证类 使用: 二.权限组件 自定义权限类 三.频率组件 ...

  3. DRF框架之认证组件用法(第四天)

    1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的 2.如何实现认证呢 ...

  4. 【DRF框架】认证组件

    DRF框架的认证组件 核心代码:       self.perform_authentication(request)  框架自带模块:    from rest_framework import a ...

  5. Django-rest framework框架的三大认证组件

    源码分析:三大认证组件的封装 组件的认证配置: 模型层:models.py class User(BaseModel): username = models.CharField(verbose_nam ...

  6. DRF框架(六)——三大认证组件之认证组件、权限组件

    drf认证组件 用户信息表 from django.db import models from django.contrib.auth.models import AbstractUser class ...

  7. drf的三大认证

    目录 三大认证任务分析 auth组件的认证权限六表 自定义User表分析 源码分析 认证与权限工作原理 源码分析 认证模块工作原理 权限模块工作原理 admin关联自定义用户表 自定义认证.权限类 用 ...

  8. DRF之三大认证

    一.用户认证Authorticatons 1.源码解析 第一步. 找入口 def dispatch(self, request, *args, **kwargs): # 1.首先我们进入的是APIVi ...

  9. DRF内置认证组件之自定义认证系统

    自定义token认证 我们知道,在django项目中不管路由以及对应的视图类是如何写的,都会走到 dispatch 方法,进行路由分发, 在阅读 APIView类中的dispatch 方法的源码中,有 ...

随机推荐

  1. spring AOP (使用AspectJ的xml方式 的aop实现) (7)

    目录 一.定义计算器接口跟实现类 二.定义两个切面,日志切面和验证切面 三.在xml中配置切面 四.测试类 一.定义计算器接口跟实现类 public interface ArithmeticCalcu ...

  2. MySQL 8.0及以上版本设置密码

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

  3. [已解决]报错This event loop is already running

    安装nest_asyncio pip install nest_asyncio 导入并调用 import nest_asyncio nest_asyncio.apply()

  4. 关于阿里云 ETC服务器 端口开放问题

    今天整了个阿里云,为了开放一个端口 各种入出规则整了半天 最后连一个hello world都发不出来.. 最后的最后 才知道 开端口除了做入规则操作 还得调一下阿里的控制台 当你也买了个ECS不要像我 ...

  5. Django的日常-数据传输

    目录 Django的日常-1 Django中最常用的三个东西 HTTPresponse render redirect 静态文件相关 form表单的get与post 神奇的request 模板的传值方 ...

  6. 49-Ubuntu-其他命令-1-文件软链接

    序号 命令 作用 01 ln -s 被链接的原文件 链接文件 建立文件的软链接,用通俗的方式讲类似于Windows下的快捷方式 注意: 没有-s选项建立的是一个硬链接文件--->>两个文件 ...

  7. 在vue中使用高德地图开发,以及AMap的引入?

    百度引入BMap ,一个import 即可,可AMap 却报AMap is not difined ? 1.首先在 externals: { "BMap": "BMap& ...

  8. 如何去实现一个运用于多平台的SDK ?

    开始要求实现一个SDk的时候,一脸懵逼,以前总是调别人的SDK暴露的接口与方法,现在自己去实现一个,可以用到各平台上,还是相当有难度的,经过大半月的研究还是有点眉目的,想在这里和大家分享一下鄙人简陋的 ...

  9. Berry 异常处理 1: 语法和字节码设计

    语法 最近在实现 Berry 的异常处理特性,进过初步的调查后决定使用类似 Python 的 try-except 异常处理模式,为此要引入三个新的关键字: try:表示异常捕获块的开始,位于异常捕获 ...

  10. 基于LNMP架构部署wordpress

    [root@localhost ~]# yum -y install unzip[root@localhost ~]# unzip wordpress-5.2.3.zip[root@localhost ...