一. 身份认证源码分析

1.1 APIView源码的分析

  APIView源码之前分析过https://www.cnblogs.com/maoruqiang/p/11135335.html,里面主要将request对象进行了封装,提供了额外的方法与属性,同时让装饰的CBV中方法忽略CSRF校验,最后还提供了身份认证、权限认证、频率校验等功能。

二. 身份认证源码分析及使用

2.1 身份认证源码分析

  在APIView中的dispatch方法中提供了三大校验:

  进入self.perform_authentication(request)方法

  返回APIView的dispatch方法中:

  进入self.initialize_request(request, *args, **kwargs)

  进入self.get_authenticators()

  此时继承APIView的类中没有定义该属性,所以看看APIView中有没有

  这里进入api_settings,搜索身份认证相关的配置

  我们将其复制到django项目中的settings.py中:

REST_FRAMEWORK = {
# 身份认证配置,实际上这是全局配置
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
)
}

  随后回到requst.user,因为request是Request的对象,所以只需的是Request的user方法

  点击进入self._authenticate()

  这就意味着我们要重写authenticate方法,那么要继承什么类吗,去之前复制到settings.py中默认的两个身份认证类中看看(将字符串复制出来改成导包的形式即可点击进入),随后进入其父类BaseAuthentication

  在应用文件夹下新建myauthenticate.py文件,其中书写如下:

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from django.contrib import auth # 身份认证组件
class AuthenticateSybil(BaseAuthentication):
def authenticate(self, request):
username = request.data.get('username')
pwd = request.data.get('password')
print('身份认证开始', username, pwd)
user_obj = auth.authenticate(username=username, password=pwd)
if user_obj:
# 分别可以使用request.user, request.auth取到
return user_obj, '认证通过'
else:
# 用于认证失败时返回信息给前端
raise AuthenticationFailed('认证失败')

  随便可以全局配置settings.py:

REST_FRAMEWORK = {
# 身份认证配置
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'app02.myauthticate.AuthenticateSybil'
)
}

  区部配置,在视图类中写即可

from rest_framework.views import APIView
from rest_framework.response import Response
from app02.myauthticate import AuthenticateSybil
# Create your views here. class Test(APIView):
authentication_classes = [AuthenticateSybil]
#复制列表为空则是局部忽略校验
authentication_classes = []
def post(self, *args, **kwargs):
print('成功进入视图函数')
return Response({"name": "sybil"})

2.2 权限校验源码分析及使用

  

  进入self.check_permissions(request)

  老样子,去api_settings中搜索权限校验类,看看他们怎么写的

  同时看看permission_denied

  同样在myauthenticate.py中书写该认证

from rest_framework.permissions import BasePermission

# 权限认证组件
class PermissionSybil(BasePermission):
message = '' def has_permission(self, request, view):
print('权限认证开始')
user_obj = request.user
if not user_obj.is_superuser:
self.message = '权限不足'
else:
return True

  全局配置:

REST_FRAMEWORK = {
# 身份认证配置
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'app02.myauthticate.AuthenticateSybil'
),
# 权限校验全局配置
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
'app02.myauthticate.PermissionSybil'
)
}

  局部配置

class Test(APIView):
authentication_classes = [AuthenticateSybil]
#局部配置,如果想忽略校验则将值改为空[]
permission_classes = [PermissionSybil] def post(self, *args, **kwargs):
print('成功进入视图函数')
return Response({"name": "sybil"})

2.3 频率校验源码分析及使用

  

  进入self.check_throttles(request)

  所以我们需要重写allow_request方法,点击进入频率校验的父类:

  父类方法如下:

  为了方便,我们使用SimpleRateThrottle

  该类实例化时会执行__init__

  先看看get_rate()方法

  那么THROTTLE_RATES是啥,我们看看

  去api_settings中查看

  接下来看看self.parse_rate(self.rate)方法

  然后看看频率组件需要重写的allow_request

  看看throttle_success

  自定义频率组件,这里同样写在myauthenticate.py中

from rest_framework.throttling import SimpleRateThrottle

# 频率校验
class ThrottleSybil(SimpleRateThrottle):
scope = 'Isybil' def get_cache_key(self, request, view):
# 这里可以直接调用父类的get_ident获取唯一标识
return super(ThrottleSybil, self).get_ident(request)

  全局配置:

REST_FRAMEWORK = {
# 身份认证配置
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'app02.myauthticate.AuthenticateSybil'
),
# 权限认证全局配置
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
'app02.myauthticate.PermissionSybil'
),
# 频率校验全局配置
'DEFAULT_THROTTLE_CLASSES': (
'app02.myauthticate.ThrottleSybil',
),
'DEFAULT_THROTTLE_RATES': {
# 用户Isybil的频率限制,类中scope = 'Isybil'可以获取该限制
'Isybil': '3/m',
},
}

  局部配置

from rest_framework.views import APIView
from rest_framework.response import Response
from app02.myauthticate import AuthenticateSybil, PermissionSybil, ThrottleSybil
# Create your views here. class Test(APIView):
authentication_classes = [AuthenticateSybil]
permission_classes = [PermissionSybil]
throttle_classes = [ThrottleSybil] def post(self, *args, **kwargs):
print('成功进入视图函数')
return Response({"name": "sybil"})

django身份认证、权限认证、频率校验使用及源码分析的更多相关文章

  1. drf 权限校验设置与源码分析

    权限校验 权限校验和认证校验必须同时使用,并且权限校验是排在认证校验之后的,这在源码中可以查找到其执行顺序. 权限校验也很重要,认证校验可以确保一个用户登录之后才能对接口做操作,而权限校验可以依据这个 ...

  2. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  3. Spring Security(1):认证和授权的核心组件介绍及源码分析

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方式的安全框架.它包括认证(Authentication)和授权(Authorization)两个部 ...

  4. Django 基于类的视图(CBV)执行流程 CBV 源码分析

    一.CBV(基于类的视图) 视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码. 基本示例 D ...

  5. Django drf:cbv(class base view)源码分析

    cbv是基于类的视图 # 首先要在路由层配置: # 找到类绑定方法as_view # 点开dispatch的方法 # http_method_names其实就是方法的列表 整个流程: 1.写一个基于类 ...

  6. DRF 认证 权限 视图 频率

    认证组件 使用:写一个认证类,继承BaseAuthentication 在类中写authenticate方法,把request对象传入 能从request对象中取出用户携带的token根据token判 ...

  7. Django(64)频率认证源码分析与自定义频率认证

    前言 有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定 频率认证源码分析 def check_throttles(self, request): ...

  8. Django rest framework 的认证流程(源码分析)

    一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...

  9. Django REST framework —— 认证组件源码分析

    我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...

随机推荐

  1. 大家都在关注AI,但这些事你可能并不知道!

    我们正处在第四次工业革命,其特点是机器人和自驾车技术的进步,智能家电的泛滥等等.所有这些最前沿的是人工智能(AI),也是自动化计算机系统的发展,可以匹配甚至超过人类的智力. 你的自动驾驶可能会编程杀死 ...

  2. 录音文件lame转换MP3相关配置

    文件下载整个功能完成了,那么对应的文件上传也跑不了.So~ Look here~ 业务需求是录制音频然后上传到七牛并且Android可以读. 与安卓沟通了一下统一了mp3格式,大小质量都不错.由于AV ...

  3. Windows 下 LaTeX 手动安装宏包(package)以及生成帮助文档的整套流程

    本文简单介绍如何手动安装一个 LaTeX 宏包. 一般来说,下载的 TeX 发行版已经自带了很多宏包,可以满足绝大部分需求,但是偶尔我 们也可能碰到需要使用的宏包碰巧没有安装的情况,这时我们就需要自己 ...

  4. ndk-stack使用方法(转)

    最近在mac上编译android 版本,各种崩溃让人蛋疼,网上学习了下ndk-stack使用方法. 自己备忘下: 1.运行终端. 跳转到你android sdk 目录 因为你的adb 在里面. 如 c ...

  5. github里的readme.md

    在github里如何写readme.md https://www.cnblogs.com/guchunli/p/6371040.html----------------------> READM ...

  6. Rails工程实战记录

    项目git:https://github.com/yixiaoyang/ruby 为熟悉Rails的基本特性创建的工程,本博文仅作更新记录. (1)2013.10.1-2013.10.5 Ruby基本 ...

  7. BeetleX之XRPC远程委托调用

    BeetleX.XRPC是基于接口的远程通讯组件,它不紧可以把接口提供客户端调用,同样也支持服务端创建客户端的接口实例并主动调用客户端的方法.接口有着非常的规范性和约束性,但前提你是必须制定相应的接口 ...

  8. 使用 Hexo 创建项目文档网站

    当我们发布一个开源项目的时候,最重要的事情之一就是要创建项目文档.对使用项目的用户来说,文档是非常有必要的,通常我们可以使用下面这些方式来创建文档: GitHub Wiki:在 Github 上我们可 ...

  9. 提高 Web开发性能的 10 个方法

    随着网络的高速发展,网络性能的持续提高成为能否在芸芸App中脱颖而出的关键.高度联结的世界意味着用户对网络体验提出了更严苛的要求.假如你的网站不能做到快速响应,又或你的App存在延迟,用户很快就会移情 ...

  10. CSS Sprite雪碧图的应用

    CSS雪碧图,即CSS Sprite,也有人叫它CSS精灵图,是一种图像拼合技术.该方法是将多个小图标和背景图像合并到一张图片上,然后利用CSS的背景定位来显示需要显示的图片部分. 雪碧图的使用场景 ...