06 drf源码剖析之权限
2024-10-09 07:15:42
06 drf源码剖析之权限
1. 权限简述
- 权限与身份验证和限制一起,决定了是否应授予请求访问权限。
- 权限检查始终在视图的最开始处运行,然后再允许执行其他任何代码。权限检查通常会使用
request.user
和request.auth
属性中的身份验证信息来确定是否应允许传入请求。 - 权限用于授予或拒绝不同类别的用户对API不同部分的访问。
2. 权限使用
自定义权限认证类
from rest_framework.permissions import BasePermission
from rest_framework import exceptions class MyPermission(BasePermission):
message = {'code': 10001, 'error': '你没权限'}
def has_permission(self, request, view):
"""
Return `True` if permission is granted, `False` otherwise.
"""
if request.user:
return True # raise exceptions.PermissionDenied({'code': 10001, 'error': '你没权限'})
return False def has_object_permission(self, request, view, obj):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return False
在需要权限认证的类中加permission_classes
class OrderView(APIView):
permission_classes = [MyPermission,]
def get(self,request,*args,**kwargs):
return Response('order') class UserView(APIView):
permission_classes = [MyPermission, ]
def get(self,request,*args,**kwargs):
return Response('user')
3.源码剖析
请求过来先执行dispatch方法
class APIView(View):
permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES def dispatch(self, request, *args, **kwargs):
# 封装request对象...
self.initial(request, *args, **kwargs)
# 通过反射执行视图中的方法...
initial方法过渡
def initial(self, request, *args, **kwargs):
# 版本的处理...
# 认证...
# 权限判断
self.check_permissions(request) self.check_throttles(request) # 节流...
check_permissions方法,依次对权限类对象认证权限
def check_permissions(self, request):
# [对象,对象,]
for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(request, message=getattr(permission, 'message', None))
get_permissions方法,将权限类实例化成对象列表
def get_permissions(self):
return [permission() for permission in self.permission_classes]
执行自定义权限类的has_permission方法,判断有无权限
class MyPermission(BasePermission):
def has_permission(self, request, view):
if request.user:
return True
return False
4. 总结
- 当用户请求过来时,先执行dispatch方法,通过initial方法执行check_permissions方法
- 找到权限的所有类并实例化成对象列表
- 循环该实例化对象列表,执行每个对象的has_permission方法
- 返回True和False进行权限的认证,可定制错误信息
最新文章
- boost.python笔记
- CPS冥想 - 1 重新审视CPS
- SAMEORIGIN
- 基础总结篇之三:Activity的task相关
- quick-cocos2d-x学习笔记—定时器
- 取消Win7任务栏窗口自动排序
- cron服务 ubuntu
- jquery中onclick=";fn";中$(this)所代表的对象
- java中的IO二
- 使用Fiddler捕获Java程序中的HTTP请求
- Home键的获取监听,安卓4.0后就不能在onkeydown方法中获取了。怎么办。
- APNS 那些事!
- C++ 拷贝控制和资源管理,智能指针的简单实现
- android-async-http详解
- Linux下编写和加载 .ko 文件(驱动模块文件)
- Confluence 6 数据中心的 SAML 单点登录最佳实践和故障排除
- 微信小程序 --- action-sheet底部弹框
- ajax readyState=4并且status=200时,还进error方法
- before_request after_request
- API——SendMessageTimeout