DRF 的权限系统用于控制用户对 API 端点的访问权限,它在认证系统之后执行,决定已认证用户可以执行什么操作。

1、BasePermission

所有权限类都应从其继承的基类。


class BasePermission(metaclass=BasePermissionMetaclass): def has_permission(self, request, view):
return True def has_object_permission(self, request, view, obj):
return True

2、内置的权限类

2.1 AllowAny

允许任何用户访问,无论是否认证。


class AllowAny(BasePermission):
def has_permission(self, request, view):
return True

2.2 IsAuthenticated

只允许已认证的用户访问。


class IsAuthenticated(BasePermission):
def has_permission(self, request, view):
return bool(request.user and request.user.is_authenticated)

2.3 IsAdminUser

只允许管理员用户访问(user.is_staff = True)

class IsAdminUser(BasePermission):
def has_permission(self, request, view):
return bool(request.user and request.user.is_staff)

2.4 IsAuthenticatedOrReadOnly

已认证用户或只读请求


SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS') class IsAuthenticatedOrReadOnly(BasePermission):
def has_permission(self, request, view):
return bool(
request.method in SAFE_METHODS or
request.user and
request.user.is_authenticated
)

2.5 DjangoModelPermissions

基于 Django 的模型权限系统,自动映射到 DRF 的 HTTP 方法,映射关系如下:

perms_map = {
'GET': [],
'OPTIONS': [],
'HEAD': [],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': ['%(app_label)s.delete_%(model_name)s'],
}

class DjangoModelPermissions(Baseermission): authenticated_users_only = True def has_permission(self, request, view):
if not request.user or (
not request.user.is_authenticated and self.authenticated_users_only):
return False
queryset = self._queryset(view)
perms = self.get_required_permissions(request.method, queryset.model) return request.user.has_perms(perms)

2.6 DjangoModelPermissionsOrAnonReadOnly

类似于 DjangoModelPermissions,但允许匿名用户进行只读访问。

authenticated_users_only = False

2.7 DjangoObjectPermissions

基于 Django 的对象级权限,需要 django-guardian 包支持


class DjangoObjectPermissions(DjangoModelPermissions):
def has_object_permission(self, request, view, obj): queryset = self._queryset(view)
model_cls = queryset.model
user = request.user perms = self.get_required_object_permissions(request.method, model_cls) if not user.has_perms(perms, obj):
if request.method in SAFE_METHODS:
raise Http404
read_perms = self.get_required_object_permissions('GET', model_cls)
if not user.has_perms(read_perms, obj):
raise Http404
return False
return True

3、自定义权限类

创建自定义权限类需要继承 BasePermission 并实现 has_permission 和/或 has_object_permission 方法。


from rest_framework.permissions import BasePermission class IsOwner(BasePermission):
"""
自定义权限:只允许对象的所有者访问
""" def has_object_permission(self, request, view, obj):
# 检查用户是否是对象的所有者
return obj.owner == request.user class IsOwnerOrReadOnly(BasePermission):
"""
自定义权限:允许所有人读取,但只有所有者可以修改
""" def has_object_permission(self, request, view, obj):
# 允许安全的HTTP方法(GET, HEAD, OPTIONS)
if request.method in permissions.SAFE_METHODS:
return True # 写操作只允许所有者
return obj.owner == request.user

4、权限使用

4.1 全局权限配置


# settings.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}

4.2 视图级权限配置


# 类视图
class MyView(APIView):
permission_classes = [IsAuthenticated, IsOwner] # 视图集
class MyViewSet(ModelViewSet):
permission_classes = [IsAuthenticated, BusinessHoursOnly] # 函数视图
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def my_view(request):
return Response({"message": "Authenticated user only"})

5、DRF权限校验源码

APIView.dispatch->initial->check_permissions->


class APIView(View):
def dispatch(self, request, *args, **kwargs):
self.initial(request, *args, def initial(self, request, *args, **kwargs):
self.check_permissions(request) def check_permissions(self, request):
# 循环调用每个权限类的has_permission方法,任何一个返回False则抛出异常
for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request,
message=getattr(permission, 'message', None),
code=getattr(permission, 'code', None)
) # 该方法有被GenericAPIView中的get_object调用
def check_object_permissions(self, request, obj):
# 循环调用每个权限类的has_object_permission方法,任何一个返回False则抛出异常
for permission in self.get_permissions():
if not permission.has_object_permission(request, self, obj):
self.permission_denied(
request,
message=getattr(permission, 'message', None),
code=getattr(permission, 'code', None)
)

DRF权限的更多相关文章

  1. python 全栈开发,Day97(Token 认证的来龙去脉,DRF认证,DRF权限,DRF节流)

    昨日内容回顾 1. 五个葫芦娃和三行代码 APIView(views.View) 1. 封装了Django的request - request.query_params --> 取URL中的参数 ...

  2. DRF 权限的流程

    DRF 权限的流程 django rest framework,入口是 dispatch,然后依次 --->>封装请求--->>处理版本--->>>认证--- ...

  3. 一.8.django权限管理/drf权限管理

    1.什么是权限管理: .权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源 .权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系 ...

  4. DRF 权限和频率

    Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...

  5. DRF 权限 频率

    DRF的权限 权限是什么 大家之前都应该听过权限~那么我们权限到底是做什么用的呢~~ 大家都有博客~或者去一些论坛~一定知道管理员这个角色~ 比如我们申请博客的时候~一定要向管理员申请~也就是说管理员 ...

  6. 【DRF权限】

    目录 权限的详细用法 我们都听过权限,那么权限到底是做什么的呢. 我们都有博客,或者去一些论坛,一定知道管理员这个角色, 比如我们申请博客的时候,一定要向管理员申请,也就是说管理员会有一些特殊的权利, ...

  7. drf 权限认证

    目录 复习 前期准备 三大认证简介 AbstracUser源码分析 自定义User下的权限六表 models.py 到settings.py中注册 注意点: 执行数据迁移的俩条命令 创建超级用户 t_ ...

  8. drf权限,频率,过滤,排序,异常处理

    目录 一.权限 1 权限源码分析 2 自定义权限类 3 内置权限类 二.频率 1 内置频率设置 三.过滤 四.排序 五.异常处理 一.权限 1 权限源码分析 # APIView---->disp ...

  9. Django(63)drf权限源码分析与自定义权限

    前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...

  10. drf权限组件

    1.简介 设置哪种用户的权限可以做什么事 2.用法 在MyAuth文件编写权限类, from rest_framework.permissions import BasePermission 代码如下 ...

随机推荐

  1. [书籍精读]《移动WEB前端高级开发实践》精读笔记分享

    写在前面 书籍介绍:<移动WEB前端高级开发实践>这本书的内容涵盖了移动Web前端开发中的各个关键技术环节.分别从HTML5.CSS3.JavaScript的ECMAScript5和ECM ...

  2. 探索大模型:袋鼠云在 Text To SQL 上的实践与优化

    Text To SQL 指的是将自然语言转化为能够在关系型数据库中执行的结构化查询语言(简称 SQL).近年来,伴随人工智能大模型技术的不断进步,Text To SQL 任务的成功率显著提升,这得益于 ...

  3. ArkUI-X案例解析

    目前,已经有按照方案完成整体改造的4个Sample作为完整案例. 应用描述 链接 鸿蒙世界 HMOSWorld 溪村小镇 OxHornCampus 音乐专辑 MusicHome 购物应用 MultiS ...

  4. dotnet 代码调试方法

    本文将会从基础到高级,从简单到复杂的顺序,告诉大家如何调试 dotnet 系应用,特别是桌面端应用.本文将会向大家介绍使用 VisualStudio 大量的功能用来提高调试效率,穿插着也会介绍一些好用 ...

  5. C# 抛出异常代码应该避免使用 System.Exception或ApplicationException

    在.NET开发中,异常处理是确保程序健壮性和可靠性的关键部分.然而,许多开发者在编写代码时,可能会默认使用 System.Exception 或 ApplicationException 来抛出异常. ...

  6. python 简单socket

    简介 python 简单socket code import socket HOST = '103.46.128.53' PORT = 24876 BUFSIZ = 1024 ADDR = (HOST ...

  7. SciTech-Logic:逻辑学-Introduction to Logic: Irvine - 5.2 Class and Statement 类与直言命题

    类与直言命题 亚里士多德三段论逻辑,主要探讨的是关于不同对象类之间相互关系的论证. Class:类 Class类,指的是共有certain specific property:某种特定属性的objec ...

  8. SSL/TLS的认证和加密问题

    基本概念 TLS TLS(Transport Layer Security) 是保证数据在互联网上安全传输的加密协议:保证数据在传输的过程中中间的人无法解密,无法修改.TLS 要解决的问题就是,能证明 ...

  9. 解密prompt系列57. Agent Context Engineering - 多智能体代码剖析

    承接上篇对Context Engineering的探讨,本文将聚焦多智能体框架中的上下文管理实践.我们将深入剖析两个代表性框架:字节跳动开源的基于预定义角色与Supervisor-Worker模式的 ...

  10. ORACLE数据库表空间使用率查询-九五小庞

    SELECT a.tablespace_name "表空间名", total "表空间大小", free "表空间剩余大小", (total ...