一、概述

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

简单来说就是:

认证确定了你是谁

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

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

二、认证

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. day5心得

    import 模块 1.定义: 模块:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能),本质就是.py结尾的python文件(文件名test.py 模块名:test) 2导入方法 ...

  2. C++虚函数与纯虚函数用法与区别(转载)

    1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...

  3. Enumeration & Structures & Protocl & Extension

    [Enumeration and Structures] 1.使用toRaw.fromRaw方法可以在原始值之间.注意enum的定义中使用了case.另外要注意switch中的枚举值. 2.struc ...

  4. HtmlHelper扩展

    扩展 HtmlHelper类 public static class MyHtmlHelper { //扩展方法 //静态类,静态方法,this关键字 //调用方法<%=Html.MyLabel ...

  5. Angular24 树形菜单 ???

    待更新... 2018年5月21日15:17:47 参考博文01 参考博文02

  6. jQuery基础,选择器

    jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“write Less, ...

  7. jsoup 的简单应用

    导入相关jar包 package jsoup.zr.com.utils; import java.io.IOException; import java.util.List; import org.j ...

  8. SQL 数据排重,去掉重复数据 有用

    .最大的错误:    在对数据排重的时候,首先想到的就是Distinct,虽然这很管用,但多数场合下不适用,因为通常排重后还要做进一步处理,比如对编号排重后要按日期统计等. 无法排重的Group by ...

  9. jQuery基础教程-第8章-003Providing flexible method parameters

    一.The options object 1.增加阴影效果 (function($) { $.fn.shadow = function() { return this.each(function() ...

  10. MVC 知识点随笔

    1.https://msdn.microsoft.com/zh-cn/gg981918  <text></text>  等同于 @: