权限控制

前言

用户验证用户权限,根据不同访问权限控制对不同内容的访问。

建议了解视图、token验证的内容。

使用流程

  1. 自定义访问权限类,继承BasePermission,重写has_permission()方法,如果权限通过,就返回True,不通过就返回Falsehas_permission()方法接受两个参数,分别是requestview,也就是视图类的实例化本身。

  1. 配置。

局部配置:

permission_classes = [MyUserPermission]

全局配置:

REST_FRAMEWORK={
'DEFAULT_PERMISSION_CLASSES': ['libs.MyAuth.UserPermission',],
}

示例

class SVIPPermission(BasePermission):   # 推荐继承BasePermission类
# message = 'You do not have permission to perform this action.'#默认值
message = '无此权限!!!' def has_permission(self, request, view):
if request.user.user_type == 3:
return False # False为没权限
# view.queryset = # 可以使用这种方式控制视图中要处理的数据(根据不同权限)
return True # True为有权限

源码分析

进入dispatch函数,查看initial方法(执行三大验证)中的check_permissions方法:

self.check_permissions(request)将会根据request中的用户内容进行权限控制。

由上可知,permission_classes要么读取配置文件中的DEFAULT_PERMISSION_CLASSES(全局),要么就在视图类中直接对permission_classes赋值(局部)。

节流限制

前言

控制网站访问频率。

使用流程

  1. 自定义限制类,继承BaseThrottle
  2. 指定从配置文件中要读取的scope(key),形式为scope="key"

全局配置:

REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
}
}

局部配置:

throttle_classes = [UserRateThrottle]

就比如UserRateThrottle,继承了SimpleRateThrottle,指定了它所限制的scope,重写了get_cache_key方法。

源码分析

APIViewinitial方法中,三大验证还剩下最后一个没有分析,那就是访问频率验证,如下图:

接下来让我们查看check_throttles,可以看到,验证访问频率的时候,调用的方法为频率验证类的allow_request方法。

其中get_throttles用的还是老套路:

示例

自定义一个频率限制类:

from rest_framework.throttling import BaseThrottle
import time # 存放访问记录(一般放数据库或者缓存中)
VISIT_RECORD = {} class VisitThrottle(BaseThrottle): def __init__(self):
self.history = None def allow_request(self, request, view):
# 1. 获取用户ip
remote_addr = request.META.get("REMOTE_ADDR") # 2. 添加到访问记录中
ctime = time.time() # 当VISIT_RECORD中没有这个记录,可以直接访问,添加一个记录
if remote_addr not in VISIT_RECORD:
VISIT_RECORD[remote_addr] = [ctime, ]
return True history = VISIT_RECORD.get(remote_addr)
self.history = history # 拿到最后历史记录里面的最后一个时间,如果最后一个时间小于当前时间-60(一分钟之前的记录)
while history and history[-1] < ctime - 60:
history.pop() if len(history) < 3: # 允许
history.insert(0, ctime)
return True return False # False表示访问频率太高被限制 def wait(self):
"""
还需要等多少秒可以访问
:return:
"""
ctime = time.time()
return 60 - (ctime - self.history[-1])

注意:官方内置的 SimpleRateThrottle 类中对scope的处理值得一看。

DRF之访问权限控制和访问频率控制(节流)的更多相关文章

  1. Chapter6_访问权限控制_访问权限修饰词

    Java中有四种访问权限,public,private,protected和包访问权限,它们是置于类中每一个成员之前的定义,无论是一个域还是一个方法,下面一一介绍. 一.包访问权限 如果不提供任何访问 ...

  2. MongoDB 安全和访问权限控制

    MongoDB的访问控制能够有效保证数据库的安全,访问控制是指绑定Application监听的IP地址,设置监听端口,使用账户和密码登录 一,访问控制的参数 1,绑定IP地址 mongod 参数:-- ...

  3. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  4. 使用nginx和iptables做访问权限控制(IP和MAC)

    之前配置的服务器,相当于对整个内网都是公开的 而且,除了可以通过80端口的nginx来间接访问各项服务,也可以绕过nginx,直接ip地址加端口访问对应服务 这是不对的啊,所以我们要做一些限制 因为只 ...

  5. [THINKING IN JAVA]访问权限控制

    6 访问权限控制 6.1 包:库单元 package.import.import *.import static: 修改classpath环境变量可以将自己写的类库添加至环境变量并在任何java程序中 ...

  6. Java成员的访问权限控制

    Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...

  7. 浅析Java中的访问权限控制

    浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...

  8. redis密码设置、访问权限控制等安全设置

    redis作为一个高速数据库,在互联网上,必须有对应的安全机制来进行保护,方法有2,如下. 1.比较安全的办法是采用绑定IP的方式来进行控制.  请在redis.conf文件找到如下配置 # If y ...

  9. JAVA访问权限控制[zhuan]

    Java的访问权限控制修饰符,从最大权限到最小权限依次是:public.protected.包访问权限(默认,没有关键字)和private.对于类的访问权限只能是:public和包访问权限(但内部类可 ...

随机推荐

  1. 课堂练习之疫情APP

    title: 课堂练习之疫情查询APP date: 2020-03-17 20:08:51 tags: 在之前的体温记录APP上改进,只写出疫情信息查询页面的代码. 实体类与上篇博客SSM整合中的Ci ...

  2. 【老孟Flutter】41个酷炫的 Loading 组件库

    老孟导读:目前 loading 库中包含41个动画组件,还会继续添加,同时也欢迎大家提交自己的 loading 动画组件或者直接微信发给我也可以. Github 地址:https://github.c ...

  3. 影评网站Alpha版本-测试与发布

    影评网站Alpha版本-测试与发布 项目发布地址: http://120.78.161.21:8080/zhiying/ (建议使用Chrome或火狐浏览器打开,其他浏览器可能加载失败 一.Alpha ...

  4. 人社部新职业,Panda Global发现区块链新职业榜上有名!

    近日,为了助力新冠肺炎疫情的防控,扎实做好"六稳"工作,全面落实"六保"任务,促就业拓岗位,人力资源社会保障部联合市场监管总局.国家统计局近日正式向社会发布一批 ...

  5. Codeforces Edu Round 65 A-E

    A. Telephone Number 跟之前有一道必胜策略是一样的,\(n - 10\)位之前的数存在\(8\)即可. #include <iostream> #include < ...

  6. 题解-CF163E e-Government

    题面 CF163E e-Government 给 \(n\) 个字符串 \(s_i\) 和 \(q\) 个询问,刚开始字符串都服役.每次操作将集合中的一个字符串设为退役或服役,或查询与文本串 \(S_ ...

  7. window下使用cmd查看端口占用的进程,并杀死该进程

    做项目的时候经常会遇到"address already in use"的情况,此时可以选择使用dos命令将该进程杀死. 首先,查找端口对应的进程,使用命令(以进程号8080为例): ...

  8. 8、Spring Cloud Zuul

    1.Zuul简介 Zuul包含了对请求的路由和过滤两个最主要的功能. 路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础. 过滤器功能则负责对请求的处理过程进行干预,是实现请 ...

  9. vue 图片优化

    https://developer.aliyun.com/mirror/npm/package/image-conversionnpm i image-conversion --save # or y ...

  10. Spark Connector Reader 原理与实践

    本文主要讲述如何利用 Spark Connector 进行 Nebula Graph 数据的读取. Spark Connector 简介 Spark Connector 是一个 Spark 的数据连接 ...