DRF之权限组件源码分析

【一】权限组件介绍

  • Django REST framework(DRF)中的权限组件用于控制API的访问权限。
  • DRF内置了多个常用的权限类,同时也允许你创建自定义的权限类以满足特定需求。

【二】内置权限类

  • IsAuthenticated:要求用户在访问API时进行身份验证,即用户必须登录。
  • IsAdminUser:要求用户是管理员。
  • IsAuthenticatedOrReadOnly:要求用户在写入数据(例如创建、更新、删除)之前进行身份验证,但允许未经身份验证的用户进行只读操作。
  • IsOwnerOrReadOnly:通常用于处理对象级别的权限。它要求用户在对对象进行写入操作时是对象的所有者,但允许未经身份验证的用户进行只读操作。

【三】执行流程分析

  • DRF的权限组件在视图类的 perform_authentication 方法之后执行。

# 执行视图类中的 校验函数,也就是我们重写的has_permission 方法
# 完成对权限的校验 , 返回 True 或 False 供其他方法进一步判断
# 当返回True 时 ,可以返回一个 User 对象
self.check_permissions(request)
  • 用户发送API请求。

def check_permissions(self, request):
"""
Check if the request should be permitted.
Raises an appropriate exception if the request is not permitted.
"""
# 遍历每一个权限限制类对象
for permission in self.get_permissions(): # 判断权限类中是否重写了 has_permission 校验方法
# 如果没有重写则抛出异常
if not permission.has_permission(request, self):
self.permission_denied(
request,
message=getattr(permission, 'message', None),
code=getattr(permission, 'code', None)
)
  • DRF的身份验证组件(如Token、Session等)会验证用户的身份,并将用户信息添加到请求对象中。

  • 权限组件开始执行。

    • 它会检查请求对象中的用户信息,并根据所选的权限类来判断用户是否有权限访问视图。
def get_permissions(self):
"""
Instantiates and returns the list of permissions that this view requires.
"""
# 将每一个权限类对象返回给上层调用
return [permission() for permission in self.permission_classes]
  • 如果权限验证失败,DRF将返回HTTP 403 Forbidden响应。

【四】内置权限类源码分析

【0】BasePermission

  • BasePermission 类是所有自定义权限类的基类。
  • 它定义了 has_permissionhas_object_permission 两个方法,这些方法用于控制API的访问权限。
from rest_framework.permissions import BasePermission
class BasePermission(metaclass=BasePermissionMetaclass):
"""
A base class from which all permission classes should inherit.
""" # 视图级别的权限检查,它接受 request 和 view 参数,
# 在这个方法中编写自定义的权限逻辑来判断用户是否有权访问整个视图。
def has_permission(self, request, view):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True # 对象级别的权限检查,它接受 request、view 和 obj 参数
# 在这个方法中编写自定义的权限逻辑来判断用户是否有权访问特定对象(例如数据库中的某个记录)。
def has_object_permission(self, request, view, obj):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True

【1】IsAuthenticated

  • 要求用户在访问API时进行身份验证,即用户必须登录。
from rest_framework.permissions import IsAuthenticated
class IsAuthenticated(BasePermission):
"""
Allows access only to authenticated users.
""" def has_permission(self, request, view):
return bool(request.user and request.user.is_authenticated)

【2】IsAdminUser

  • 要求用户是管理员。
from rest_framework.permissions import IsAdminUser
class IsAdminUser(BasePermission):
"""
Allows access only to admin users.
""" def has_permission(self, request, view):
return bool(request.user and request.user.is_staff)

【3】IsAuthenticatedOrReadOnly

  • 要求用户在写入数据(例如创建、更新、删除)之前进行身份验证,但允许未经身份验证的用户进行只读操作。
from rest_framework.permissions import  IsAuthenticatedOrReadOnly
class IsAuthenticatedOrReadOnly(BasePermission):
"""
The request is authenticated as a user, or is a read-only request.
""" def has_permission(self, request, view):
return bool(
request.method in SAFE_METHODS or
request.user and
request.user.is_authenticated
)

【4】IsOwnerOrReadOnly

  • 通常用于处理对象级别的权限。它要求用户在对对象进行写入操作时是对象的所有者,但允许未经身份验证的用户进行只读操作。

【五】权限组件使用步骤(固定用法)

【1】创建权限认证类

  • 创建一个自定义的权限认证类,并让它继承自BasePermission

【2】实现has_permission方法

  • 在这个方法中编写自定义的权限逻辑来判断用户是否有权访问整个视图。
  • 在类中写方法:has_permission
    • 如果有权限,就返回True
    • 如果没有权限,就返回False
    • 错误信息是self.message='字符串'

【3】权限认证逻辑

from rest_framework import permissions

class CustomPermission(permissions.BasePermission):
def has_permission(self, request, view):
# 在这里编写视图级别的权限逻辑
return True # 或者根据需求返回 True 或 False def has_object_permission(self, request, view, obj):
# 在这里编写对象级别的权限逻辑
return True # 或者根据需求返回 True 或 False

【4】使用权限认证类

  • 在视图类中,使用认证类

(1)局部使用

  • 在视图类中添加permission_classes属性,并将所需的权限认证类作为其值
  • 这样,在该视图类中只会应用指定的权限认证类。
# 权限认证
class UserDetailView(APIView):
permission_classes = [AdminPermission, ]

(2)全局使用

  • 在配置文件(一般是settings.py)中进行全局配置,将权限认证类添加到DEFAULT_PERMISSION_CLASSES中。
  • 这样,在所有视图类中都会应用该权限认证类。
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'app01.permission.CustomPermission'
],
}

(3)全局使用/局部禁用

  • 当认证组件被全局配置后,可以在视图类中禁用全局认证组件,以实现局部禁用。

    • 如果权限认证组件被全局配置,你仍然可以在某个视图类中禁用全局的权限认证,实现局部禁用的效果。
    • 只需在该视图类中将permission_classes属性设置为空列表即可。
# 权限认证 - 局部禁用
class UserDetailView(APIView):
permission_classes = []

(4)权限认证类的使用顺序

  • 先局部,在视图类定义的 permission_classes
  • 再全局,在DRF中自己配置的 DEFAULT_PERMISSION_CLASSES
  • 最后是,DRF默认配置中的 DEFAULT_PERMISSION_CLASSES

DRF之权限组件源码分析的更多相关文章

  1. DRF的Serializer组件(源码分析)

    DRF的Serializer组件(源码分析) 1. 数据校验 drf中为我们提供了Serializer,他主要有两大功能: 对请求数据校验(底层调用Django的Form和ModelForm) 对数据 ...

  2. DRF的认证组件(源码分析)

    DRF认证组件(源码分析) 1. 数据库建立用户表 在drf中也给我们提供了 认证组件 ,帮助我们快速实现认证相关的功能,例如: # models.py from django.db import m ...

  3. Django REST framework —— 权限组件源码分析

    在上一篇文章中我们已经分析了认证组件源码,我们再来看看权限组件的源码,权限组件相对容易,因为只需要返回True 和False即可 代码 class ShoppingCarView(ViewSetMix ...

  4. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    认证组件 权限组件 频率组件

  5. Django框架之drf:8、断点调试,权限、认证、频率组件源码分析,基于APIView编写分页,异常处理

    Django框架之drf 一.断点调式使用 ​ 指,在我们编写代码的时候,程序运行出现报错是无可避免的,当程序 出现报错时,我们需要找到出现报错的代码进行修改,如果时简短的代码很容易就可以找到报错位置 ...

  6. DRF的限流组件(源码分析)

    DRF限流组件(源码分析) 限流,限制用户访问频率,例如:用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次, 防止盗刷. 对于匿名用户,使用用户IP作为唯一标识. 对于登录用户,使用 ...

  7. 断点调试/认证/权限/频率-源码分析/基于APIView编写分页/异常处理

    内容概要 断点调试 认证/权限/频率-源码分析 基于APIView编写分页 异常处理 断点调试 # 程序以 debug模式运行,可以在任意位置停下,查看当前情况下变量数据的变化情况 # pycharm ...

  8. Django-restframework 源码之认证组件源码分析

    Django-restframework 源码之认证组件源码分析 一 前言 之前在 Django-restframework 的流程分析博客中,把最重要的关于认证.权限和频率的方法找到了.该方法是 A ...

  9. element-ui 组件源码分析整理笔记目录

    element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...

  10. ceph-csi组件源码分析(1)-组件介绍与部署yaml分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi组件源码分析(1)-组件介绍与部署yaml分析 基于tag v3.0.0 ht ...

随机推荐

  1. 关于Linux的core dump

      core dump简介 core dump就是在进程crash时把包括内存在内的现场保留下来,以备故障分析. 但有时候,进程crash了却没有输出core,因为有一些因素会影响输出还是不输出cor ...

  2. 抽象类和接口的对比、及各自的使用场景--java进阶day02

    1.区别 2.各自的使用场景 1.抽象类的使用场景 如图,有三个类,其中存在共性,我们就会写一个父类并抽取出共性的东西,但有的方法难免会描述不清,所以我们就将其写为了抽象方法,抽象方法又得存在于抽象类 ...

  3. 【Git】基本操作

    一.Git 基础 1.Git 介绍 Git 是目前世界上最先进的分布式版本控制系统. 版本控制系统: 设计师在设计的时候做了很多版本 经过了数天去问设计师每个版本都改了些啥,设计师此时可能就说不上来了 ...

  4. 【数据结构与算法】找出最小的k个数:三路快速排序算法思想实现

    找出最小的k个数:三路快速排序算法思想实现 Java https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/zui-xi ...

  5. 《HarmonyOS Next开发进阶:打造功能完备的Todo应用华章》

    章节 6:日期选择器与日期处理 目标 学习如何使用DatePicker组件. 理解日期格式化和日期计算. 内容 日期选择器基础 使用DatePicker组件. 处理日期选择事件. 日期格式化 格式化日 ...

  6. devops 2024

    What is DevOps? DevOps is a mindset, a culture, and a set of technical practices. It provides commun ...

  7. 【开源推荐】AI Interviewer:基于Spring-Alibaba-AI的智能面试官系统(附GitHub实战教程)

    项目背景 作为开发者,你是否经历过: 技术面试时因紧张发挥失常? 刷了1000+LeetCode却不会表达解题思路? 花费上千元购买模拟面试服务? 今天推荐的AI Interviewer开源项目,正是 ...

  8. 想靠RAG提升模型回答质量,那是不可能的

    提供AI咨询+AI项目陪跑服务,有需要回复1 上周写了一篇AI知识库的文章:聊聊与一体机同等级的智商税:AI知识库 事实上,文章对于AI知识库是稍带了点否定的色彩,因为单独的知识库毫无意义,但企业本身 ...

  9. python实例:导入会员数据后,读取数据文件,检查导入正确性(整列取excel值、合并列、response取值)

    场景描述:某系统新上线,老系统的会员数据要导入新系统中,包含手机号,上级信息和会员余额.有1万多条数据,手工对比过于繁琐,用python自动化处理 思路:系统导入数据后,脚本读取文件,先把会员数据取出 ...

  10. 2025dsfz-KMP学习笔记

    KMP 前言:这把高端局 关于KMP 时间复杂度为 \(O(n+m)\) 的优秀字符串查找算法. 适用于在句子/文章中查找一段文字(词语). KMP实现 关于共同前后缀数组(PMT) 说人话就是 \( ...