06 drf源码剖析之权限

1. 权限简述

  • 权限与身份验证和限制一起,决定了是否应授予请求访问权限。
  • 权限检查始终在视图的最开始处运行,然后再允许执行其他任何代码。权限检查通常会使用request.userrequest.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. 总结

  1. 当用户请求过来时,先执行dispatch方法,通过initial方法执行check_permissions方法
  2. 找到权限的所有类并实例化成对象列表
  3. 循环该实例化对象列表,执行每个对象的has_permission方法
  4. 返回True和False进行权限的认证,可定制错误信息

最新文章

  1. boost.python笔记
  2. CPS冥想 - 1 重新审视CPS
  3. SAMEORIGIN
  4. 基础总结篇之三:Activity的task相关
  5. quick-cocos2d-x学习笔记—定时器
  6. 取消Win7任务栏窗口自动排序
  7. cron服务 ubuntu
  8. jquery中onclick="fn"中$(this)所代表的对象
  9. java中的IO二
  10. 使用Fiddler捕获Java程序中的HTTP请求
  11. Home键的获取监听,安卓4.0后就不能在onkeydown方法中获取了。怎么办。
  12. APNS 那些事!
  13. C++ 拷贝控制和资源管理,智能指针的简单实现
  14. android-async-http详解
  15. Linux下编写和加载 .ko 文件(驱动模块文件)
  16. Confluence 6 数据中心的 SAML 单点登录最佳实践和故障排除
  17. 微信小程序 --- action-sheet底部弹框
  18. ajax readyState=4并且status=200时,还进error方法
  19. before_request after_request
  20. API——SendMessageTimeout

热门文章

  1. Cookie和localStorage的查询、设置、修改及删除
  2. 线上排查Class、Jar加载问题的一般方法
  3. 2019-02-15 python接口图灵机器人(简单好玩)
  4. Linux使用手册
  5. 其他函数-web_concurrent
  6. 求求你,别问了,Java字符串是不可变的
  7. pikachu 搭建
  8. el-checkbox实现全选与单选
  9. 触发器_实现ORACEL自动增长字段
  10. 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」