django(63)drf权限源码分析与自定义权限(代码片段)

修炼之路 修炼之路     2022-11-29     362

关键词:

前言

上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,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
        )
        游客只读,合法用户无限制

 

自定义认证类

  1. 创建继承BasePermission的权限类
  2. 实现has_permission方法
  3. 实现体根据权限规则 确定 有无权限
  4. 进行全局或局部配置(一般采用局部配置)

权限规则
满足设置的用户条件,代表有权限,返回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:请求方法是GETOPTIONSHEAD游客和用户都可以访问
  • 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]属与局部配置,也就是自定义的权限只针对此视图,其他视图还是默认的全局配置,如果我们还有其他的关于权限的需求,只需要在自定义的权限类中写逻辑即可

drf认证权限频率(代码片段)

目录一认证Authentication认证源码分析自定义认证方案二权限Permissions源码分析使用内置提供的权限举例自定义权限三限流Throttling使用实列可选限流类实例自定义频率类一认证Authentication认证组件:校验用户-游客、合法用户、非法... 查看详情

06drf源码剖析之权限(代码片段)

目录06drf源码剖析之权限1.权限简述2.权限使用3.源码剖析4.总结06drf源码剖析之权限1.权限简述权限与身份验证和限制一起,决定了是否应授予请求访问权限。权限检查始终在视图的最开始处运行,然后再允许执行其他任何代码。... 查看详情

django(64)频率认证源码分析与自定义频率认证(代码片段)

前言有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定 频率认证源码分析defcheck_throttles(self,request):"""检查是否应限制请求。如果请求受到限制,则引发适当的... 查看详情

drf-jwt认证组件权限组件频率组件的使用(代码片段)

目录drf-jwt认证组件、权限组件、频率组件的使用认证组件权限组件频率组件drf-jwt签发token源码分析自定义签发token实现多方式登录源码分析多方式登陆签发token实例频率组件自定义频率类drf-jwt认证组件、权限组件、频率组件的使... 查看详情

django源码分析之权限系统_擒贼先擒王(代码片段)

乍见Django内置的权限系统已经很完善了,加上django-guardian提供的功能,基本上能满足大部分的权限需求。暂且不说django-guardian,我们先来看下Django内置的权限系统:django.contrib.auth包。相识一般权限系统分为全局权限和对象权限... 查看详情

django内置权限系统源码解读

前言之前有篇文章​​Django自定义认证系统原理及源码分析解读​​带大家分析解读了Django的认证逻辑,而且我们也知道认证是基础,认证通过之后,用户登录到系统,能看到那些,能操作那些,这些都是有​​权限控制​​的... 查看详情

drf版本认证权限限制解析器和渲染器(代码片段)

...局部配置(使用较少)二.DRF之认证内置的认证步骤三.DRF之权限1.自定义一个权限类2.权限局部配置3.权限全局配置四.DRF之限制1.使用自定义限制类1.1自定义一个限制类1.2限制局部配置1.3限制全局配置2.使用内置限制类2.1定义内置限制... 查看详情

drf版本认证权限限制解析器和渲染器(代码片段)

...局部配置(使用较少)二.DRF之认证内置的认证步骤三.DRF之权限1.自定义一个权限类2.权限局部配置3.权限全局配置四.DRF之限制1.使用自定义限制类1.1自定义一个限制类1.2限制局部配置1.3限制全局配置2.使用内置限制类2.1定义内置限制... 查看详情

DRF:自定义权限被拒绝消息

】DRF:自定义权限被拒绝消息【英文标题】:DRF:Custompermissiondeniedmessage【发布时间】:2021-09-1712:18:52【问题描述】:如何将默认的DRF-PermissionDenied消息从"detail":"Youdonothavepermissiontoperformthisaction."更改为类似的内容,... 查看详情

drf的权限和频率

DRF的权限权限组件源码权限和频率以及版本认证都是在initial方法里初始化的我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 在rest_framework.permissions这个文件中~存放了框架给我们提供的... 查看详情

drf权限频率(代码片段)

DRF权限频率什么是权限简单的说就是对某件事情决策的范围和程度,例如对数据的操作,普通用户只能查看,管理员用户可以增删改查权限组件源码执行APIView的方法,APIView返回View中的view函数,然后调用的dispatch方法,然后执行... 查看详情

drf之自定义权限(代码片段)

1、增加表字段:fromdjango.dbimportmodelsclassUserInfo(models.Model):username=models.CharField(max_length=32)password=models.CharField(max_length=32)email=models.CharField(max_length=64)user_type_choices=((0, 查看详情

drf权限频率(代码片段)

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

drf权限频率(代码片段)

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

认证权限频率自定义签发token-多方式登录(代码片段)

目录三大认证流程图路由配置认证组件权限组件自定义权限类配置drf自带的权限类drf-jwt签发token源码分析多方式登录签发tokenVIP用户认证权限例子频率组件自定义频率类三大认证流程图路由配置在应用下新建文件router.py#router.pyfro... 查看详情

drf的权限扩充(代码片段)

drf框架为我们提供了基本的权限验证。主要包括三种验证  1、AllowAny  所有用户  2、IsAuthenticated  验证过的用户  3、IsAdminUser  超级管理员这些权限人员不一定满足项目的权限需求。那么如果我们想定义新的权限... 查看详情

django-rest-framework---总结(代码片段)

....drf框架安装2.接口3.restful接口规范4.基于restful规范的原生Django接口drf五大模块1.请求模块:request对象2.渲染模块:浏览器和Postman请求结果渲染数据的方式不一样3.解析模块4.异常模块5.响应模块序列化组件:1.Serializer2.序列化与反... 查看详情

从数据库查询权限信息与自定义失败处理(代码片段)

从数据库查询权限信息      代码实现        我们只需要根据用户id去查询到其所对应的权限信息即可。​         所以我们可以先定义个mapper,其中提供一个方法可以根据userid查询权限信息。p... 查看详情