一、概述

认证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。

简单来说就是:

认证确定了你是谁

权限确定你能不能访问某个接口

限制确定你访问某个接口的频率

二、认证

REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案。

三、自定义Token认证

model 定义一个包含token字段的用户表

class UserInfo(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
vip = models.BooleanField(default=False)
token = models.CharField(max_length=128, null=True, blank=True)

定义登录视图:

class LoginView(APIView):
def post(self, request):
name = request.data.get('name')
pwd = request.data.get('pwd')
if name and pwd:
user_obj = models.UserInfo.objects.filter(name=name, pwd=pwd).first()
if user_obj:
# 登陆成功
# 生成token(时间戳 + Mac地址)
token = uuid.uuid1().hex
# 1.保存在用户表中
user_obj.token = token
user_obj.save()
# 2.给用户返回
return Response({'error_no': 0, 'token': token}) else:
# 用户名或密码错误
return Response({'error_no': 1, 'error': '用户名或密码错误'})
else:
return Response('无效的参数')

创建auth.py自定义一个认证类

from rest_framework.authentication import BaseAuthentication
from auth_demo import models
from rest_framework.exceptions import AuthenticationFailed class MyAuth(BaseAuthentication):
'''自定义认证类''' def authenticate(self, request):
token = request.query_params.get ('token')
if token:
# 如果请求url中携带有token参数
user_obj = models.UserInfo.objects.filter(token=token).first()
if user_obj:
# token 是有效的,返回一个元组
return user_obj, token # request.user, request.auth
else:
raise AuthenticationFailed('无效的token')
else:
raise AuthenticationFailed('请求的URL中必须携带token参数')

局部配置认证

在views中自定义一个测试类TestAuthView

from auth_demo.auth import MyAuth
from auth_demo.permissions import MyPermission
# 登录之后才能看到数据接口
class TestAuthView(APIView):
authentication_classes = [MyAuth, ] # 局部配置认证 def get(self, request):
print(request.user.name)
print(request.auth)
return Response('这个视图里面的数据只有登录后才能看到!')

全局配置认证

# 在settings.py中配置
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["auth_demo.auth.MyAuth", ]
}

四、权限

自己动手写一个权限组件

from rest_framework.permissions import BasePermission

class Mypermission(BasePermission):
message = '只有VIP才能访问' def has_permission(self, request, view):
# vip才有访问权限
# request.user:当前经过认证的用户对象
# 如果没有认证 request.user就是匿名用户
if not request.auth:
# 认证没有通过
return False
if request.user.vip:
return True
else:
return False

视图级别配置

from auth_demo.auth import MyAuth
from auth_demo.permissions import Mypermission
# 登录之后才能看到数据接口
class TestAuthView(APIView):
authentication_classes = [MyAuth, ] # 局部配置认证
permission_classes = [Mypermission, ] # 试图级别配置权限 def get(self, request):
print(request.user.name)
print(request.auth)
return Response('这个视图里面的数据只有登录后才能看到!')

全局级别设置

只需要在settings的DRF配置项中添加权限类

# DRF的配置
REST_FRAMEWORK = {
# 配置默认使用的版本控制类
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
# 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.QueryParameterVersioning',# url参数控制版本
'DEFAULT_VERSION': 'v1', # 默认的版本
'ALLOWED_VERSIONS': ['v1', 'v2'], # 有效的版本
'VERSION_PARAM': 'version', # 版本的参数名与URL conf中一致
# 自定义认证
'DEFAULT_AUTHENTICATION_CLASSES': ['auth_demo.auth.MyAuth', ],
# 自定义权限
'DEFAULT_PERMISSION_CLASSES': ['auth_demo.permissions.MyPermission', ]
}

五、限制

DRF内置了基本的限制类,首先自己动手写一个限制类,熟悉限制组件的执行过程。

自定义限制10秒内只能访问3次

自定义的限制类必须实现2个方法

allow_request() 和 wait()
分析:
# history = ['9:56:12', '9:56:10', '9:56:09', '9:56:08']  # '9:56:18' - '9:56:12'

# history = ['9:56:19', '9:56:18', '9:56:17', '9:56:08']

# 最后一项到期的时间就是下一次允许请求的时间

# 最后一项到期的时间:history[-1] + 10

# 最后一项还剩多少时间过期
# history[-1] + 10 - now

实现:

import time

# 存放访问记录信息
visit_record= {}
class MyThrottle(object):
def __init__(self):
self.history = None def allow_request(self, request, view):
# 拿到当前请求的ip作为访问记录的key
ip = request.META.get('REMOTE_ADDR')
# 拿到当前请求的时间戳
now = time.time()
if ip not in visit_record:
visit_record[ip] = []
# 把当前请求的访问记录拿出来保存到一个变量中
history = visit_record[ip]
self.history = history
# 循环访问历史,把超过10秒中的请求时间去掉
while history and now - history[-1] > 10:
history.pop()
# 此时 history中只保存了最近10秒中的访问记录
if len(history) >= 3:
# 限制十秒钟内最多只能访问三次
return False
else:
# 将当前访问时间插入history的首位
self.history.insert(0, now)
return True def wait(self):
'''告诉客户还需等待多久'''
now = time.time()
return self.history[-1] + 10 - now

单个视图类使用

from auth_demo.auth import MyAuth
from auth_demo.permissions import MyPermission
from auth_demo.throttle import MyThrottle
# 登录之后才能看到数据接口
class TestAuthView(APIView):
authentication_classes = [MyAuth, ] # 局部配置认证
permission_classes = [MyPermission, ] # 视图级别配置权限
throttle_classes = [MyThrottle, ] # 限制单个视图访问频率 def get(self, request):
print(request.user.name)
print(request.auth)
return Response('这个视图里面的数据只有登录后才能看到!')

全局使用

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['auth_demo.auth.MyAuth', ],
'DEFAULT_PERMISSION_CLASSES': ['auth_demo.permissions.MyPermission', ]
    
"DEFAULT_THROTTLE_CLASSES": ["auth_demo.throttle.MyThrottle", ]
}

使用内置限制类

from rest_framework.throttling import SimpleRateThrottle

class VisitThrottle(SimpleRateThrottle):

    scope = "xxx"

    def get_cache_key(self, request, view):
return self.get_ident(request)

全局配置

settings的REST_FRAMEWORK配置中加一个:
REST_FRAMEWORK = {
# 限制类
"DEFAULT_THROTTLE_CLASSES": ["auth_demo.throttle.VisitThrottle", ],
"DEFAULT_THROTTLE_RATES": {
"xxx": "1/s",
},
}

DRF的认证、权限 和 限制的更多相关文章

  1. DRF(4) - 认证、权限组件

    一.引入 通过前面三节课的学习,我们已经详细了解了DRF提供的几个重要的工具,DRF充分利用了面向对象编程的思想,对Django的View类进行了继承,并封装了其as_view方法和dispatch方 ...

  2. DRF的认证,频率,权限

    1,DRF的认证 初识认证:浏览器是无状态的,一次导致每次发的请求都是新的请求,所以每次请求,服务器都会进行校验,这样就很繁琐,这趟我们就需要给每一个用户登录后一个新的标识,浏览器每次都会带着这个唯一 ...

  3. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  4. DRF 版本 认证

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢大家都知道我们开发项目是有多个版本的 当我们项目越来越更新~版本就越来越多我们不可能新的版本出了~以前旧的版本 ...

  5. 9) drf JWT 认证 签发与校验token 多方式登陆 自定义认证规则反爬 admin密文显示

    一 .认证方法比较 1.认证规则图 django 前后端不分离 csrf认证 drf 前后端分离 禁用csrf 2. 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 ...

  6. DRF内置权限组件之自定义权限管理类

    DRF内置权限组件permissions 权限控制可以限制用户对于视图的访问和对于具体数据对象的访问. 在执行视图的dispatch()方法前,会先进行视图访问权限的判断 在通过get_object( ...

  7. DRF 三大认证的配置及使用方法

    目录 三大认证 一.身份认证 1.身份认证配置 1.1 全局配置身份认证模块 1.2 局部配置身份认证模块 2.drf提供的身份认证类(了解) 3.rf-jwt提供的身份认证类(常用) 4.自定义身份 ...

  8. DRF JWT认证(二)

    快速上手JWT签发token和认证,有这一篇就够了,DRF自带的和自定义的都帮你总结好了,拿去用~

  9. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

    开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...

  10. Kafka认证权限配置(动态添加用户)

    之前写过一篇Kafka ACL使用实战,里面演示了如何配置SASL PLAINTEXT + ACL来为Kafka集群提供认证/权限安全保障,但有一个问题经常被问到:这种方案下是否支持动态增加/移除认证 ...

随机推荐

  1. Python函数式编程之map()

    Python函数式编程之map() Python中map().filter().reduce()这三个都是应用于序列的内置函数. 格式: map(func, seq1[, seq2,…]) 第一个参数 ...

  2. Android 4 学习(14):Internet Resources

    参考<Professional Android 4 Development> 使用Internet资源 打开URI String myFeed = getString(R.string.m ...

  3. Delphi IOS 蓝牙锁屏后台运行

    Delphi IOS 后台运行 同样的程序,编译成android,锁屏后继续运行正常,蓝牙通讯正常,但在IOS下锁屏后程序的蓝牙就中断通讯了? IOS的机制就是这样,锁屏就关闭了. 音乐播放器是怎么做 ...

  4. OK6410之tftp下载内核,nfs…

    原文地址:OK6410之tftp下载内核,nfs挂载文件系统全过程详解[转]作者:千山我独行 由于工作的平台也是嵌入式,差不多的平台,所以一直就没有把自己买过来的ok6410板子好好玩玩.以前一直都是 ...

  5. 生成ssl脚本文件

    read -p "Enter your domain [www.example.com]: " DOMAIN echo "Create server key...&quo ...

  6. a标签:鼠标指针变成文本输入图形

    今天我在使用a标签的时候,鼠标放在上面的时候总是显示文本输入的图形,不是小手的形状,找了好久的原因才发现由于我给它绑定了一个click事件,在事件里面进行了跳转,然后把 href ="#&q ...

  7. node.js开发指南读书笔记(1)

    3.1 开始使用Node.js编程 3.1.1 Hello World 将以下源代码保存到helloworld.js文件中 console.log('Hello World!'); console.l ...

  8. JQuery实现瀑布流页面

    views.py from django.shortcuts import render,HttpResponse from app01 import models import json # Cre ...

  9. Java Http 请求

    package zr.weixin.com.utils; import java.io.BufferedReader; import java.io.IOException; import java. ...

  10. =面试题:java面试基本方向 背1 有用 项目二技术学完再看

    一.Java基础 1. 集合框架A)集合中泛型优点? 将运行期的ClaasCastException 转到编译期异常.  泛型还提供通配符 1)HashMap---允许一个键为null,允许多个值为n ...