Django(63)drf权限源码分析与自定义权限
2021/6/14 12:21:24
本文主要是介绍Django(63)drf权限源码分析与自定义权限,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf
默认是允许所有用户访问
权限源码分析
源码入口:APIView.py
文件下的initial
方法下的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), code=getattr(permission, 'code', None) )
权限在get_permissions
方法中获取到,源码如下:
def get_permissions(self): """ 实例化并返回此视图所需的权限列表。 """ return [permission() for permission in self.permission_classes]
permission_classes
又等于api_settings.DEFAULT_PERMISSION_CLASSES
,所以我们去settings.py
文件中查找
'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.AllowAny', ],
我们会发现drf
默认的权限是AllowAny
,我们去看下源码:
class AllowAny(BasePermission): """ 允许任意访问。这不是严格要求的,因为您可以使用空的 permission_classes 列表,但它很有用,因为它使意图更加明确。 """ def has_permission(self, request, view): return True
我们可以看到AllowAny
继承自BasePermission
,然后定义了has_permission
方法,返回值为True
。
drf为我们提供了4个系统权限认证:
1. AllowAny 认证规则全部返回True:`return True` 游客与登录用户都有所有权限 2. IsAuthenticated 认证规则必须有登录的合法用户:`return bool(request.user and request.user.is_authenticated)` 游客没有任何权限,登录用户才有权限 3. IsAdminUser 认证规则必须是:`return bool(request.user and request.user.is_staff)` 游客没有任何权限,登录用户才有权限 4. IsAuthenticatedOrReadOnly 认证规则必须是只读请求或者是合法用户无限制 return bool( request.method in SAFE_METHODS or request.user and request.user.is_authenticated ) 游客只读,合法用户无限制
自定义认证类
- 创建继承
BasePermission
的权限类 - 实现
has_permission
方法 - 实现体根据权限规则 确定 有无权限
- 进行全局或局部配置(一般采用局部配置)
权限规则
满足设置的用户条件,代表有权限,返回True
不满足设置的用户条件,代表有权限,返回False
自定义权限
from django.contrib.auth.models import Group from rest_framework.permissions import BasePermission class MyPermissions(BasePermission): def has_permission(self, request, view): rule1 = request.method in ['GET', 'OPTIONS', 'HEAD'] group = Group.objects.filter(name="管理员").first() groups = request.user.groups.all() rule2 = group in groups rule3 = group and groups return rule1 or (rule2 and rule3)
以上定义了3条规则
- rule1:请求方法是
GET
、OPTIONS
、HEAD
游客和用户都可以访问 - rule2:当前用户如果有多个分组,其中必须有一个分组是管理员
- rule3:管理员分组必须存在,用户必须在分组中
接下里我们定义视图
class TestView(APIView): permission_classes = [MyPermissions] def get(self, request, *args, **kwargs): print(request.user) return APIResponse(data_msg="所有用户都可以访问") def post(self, request, *args, **kwargs): print(request.user) return APIResponse(data_msg="只有管理员用户可以访问")
视图中只是添加了permission_classes = [MyPermissions]
属与局部配置,也就是自定义的权限只针对此视图,其他视图还是默认的全局配置,如果我们还有其他的关于权限的需求,只需要在自定义的权限类中写逻辑即可
这篇关于Django(63)drf权限源码分析与自定义权限的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站