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. [7.18NOIP模拟测试5]星际旅行 题解

    题面(加密) 考场上靠打表yy出的规律进而想到的正解233333 可以把一条双向边拆成两条单向边,这样的话每个点度数都为偶数,符合欧拉图的定义. 那么题目可以转化为:去掉两条边,使图中存在一条欧拉路. ...

  2. xshell突出显示集

    xshell突出显示集(参考mobaxterm,直接拷贝过来不行,应该是xshell对正则表达式的支持不够好): Underline: \b(http(s)?://[A-Za-z0-9_./& ...

  3. 12.RabbitMQ多机集群

    配置两台Linux CentOS 6.7虚拟主机 CentOS6.7下载地址 https://pan.baidu.com/s/1i5GPg9n   安装视频下载 https://pan.baidu.c ...

  4. Linux文件大小 指令&编程

    在工作和日常的编程中时常需要确定文件的大小,一些基本的查看方式在此做一个总结. 一. linux shell环境下 df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.    ...

  5. CSS:百科

    ylbtech-CSS:百科 1.返回顶部 CSS (层叠样式表) 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标 ...

  6. adb devices unauthorized的解决办法

        Hi, trying to launch adb but get: daemon not running. starting it now on port * daemon started s ...

  7. 2、Appium Desktop 使用介绍

    1.appium运行界面介绍 默认显示监控的 host 和 port , 这和 Appium-Server 中是一致的.  2.点击 “Start Server V 1.7.2” 按钮启动服务,出现如 ...

  8. java.util.Arrays,java.lang.Math,java.lang.System 类的常用方法汇总

    java.util.Arrays类是数组的工具类,一般数组常用的方法包括 二分查找:public static int  binarySearch(array[],int key),返回key的下标i ...

  9. HDU 6665 Calabash and Landlord (分类讨论)

    2019 杭电多校 8 1009 题目链接:HDU 6665 比赛链接:2019 Multi-University Training Contest 8 Problem Description Cal ...

  10. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)

    题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...