RestFramework之权限组件

一,RestFramework之权限组件源码解析

restframework的权限组件与认证组件源码类似,都需要我们自己写一个类,然后放在 permission_classes中,或者全局settings中配置;

我们直接看在dispatch()中的权限组件部分干了什么。

    def initial(self, request, *args, **kwargs):
        """
        Runs anything that needs to occur prior to calling the method handler.
        """
        self.format_kwarg = self.get_format_suffix(**kwargs)

        # Perform content negotiation and store the accepted info on the request
        neg = self.perform_content_negotiation(request)
        request.accepted_renderer, request.accepted_media_type = neg

        # Determine the API version, if versioning is in use.
        version, scheme = self.determine_version(request, *args, **kwargs)
        request.version, request.versioning_scheme = version, scheme

        # Ensure that the incoming request is permitted
        self.perform_authentication(request)
        self.check_permissions(request)  # 权限组件
        self.check_throttles(request)

再看 self.check_permissions(request):

    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():
            if not permission.has_permission(request, self):  #
                self.permission_denied(
                    request, message=getattr(permission, ‘message‘, None)
                )

可以看到,这个组件更加简单了,没有封装到request对象中,而是直接放在了APIView中;

根据源码我们写的类需要这么写:需要一个has_permission()的方法,这个方法要是返回True,表示权限认证通过  ; 还可以定义一个message,返回我们自定义的错误信息

权限类:

from app01 import models
from rest_framework.permissions import BasePermission

class VipPermission(BasePermission):
    message = "您没有访问权限"

    def has_permission(self, request, my_cbv):
        if request.user.user_level >= 2:
            return True
        return False

视图类:

class BookView(generics.GenericAPIView, ListModelMixin, CreateModelMixin):
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer

    # authentication_classes = [UserAuth]
    permission_classes = [VipPermission]

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

也可以在settings中配置:

REST_FRAMEWORK = {
    ‘DEFAULT_PARSER_CLASSES‘: (
        ‘rest_framework.parsers.JSONParser‘,
        ‘rest_framework.parsers.FormParser‘,
        ‘rest_framework.parsers.MultiPartParser‘
    ),
    ‘DEFAULT_AUTHENTICATION_CLASSES‘: (
        ‘app01.utils.auth_class.UserAuth‘,
    ),
    ‘DEFAULT_PERMISSION_CLASSES‘: (
        ‘app01.utils.permission_class.VipPermission‘,  # 注意这里是要一个可迭代的,所以逗号不能少
    ),
}

结果:

原文地址:https://www.cnblogs.com/glh-ty/p/9683137.html

时间: 2024-08-30 17:04:38

RestFramework之权限组件的相关文章

rest-framework之权限组件

权限介绍 只用超级用户才能访问指定的数据,普通用户不能访问,所以就要有权限组件对其限制 源码部分 权限类: class MyPermission(): def has_permission(self,request,view): if request.user.user_type == 1: return True else: return False 视图类: class Books(APIView): # authentication_classes = [类名,类名] #只有超级用户才能访

ASP.NET通用权限组件实现一

沙发(SF)通用权限验证组件 开篇 上一篇提到了通用权限的设计思路,根据设计思路一步一步的来实现一个相对通用的权限验证组件.在VS2010下用C#语言基于.net framework2.0框架实现具体功能. 配置文件 配置文件为XML格式(SFPermission.xml)公有四个节点分类: 一.AppSet节点:此节点配置一些基础信息. 1 <AppSet> 2 <!--数据库节点名称(必须在Web.config的connectionStrings节点下面)--> 3 <a

ASP.NET通用权限组件思路设计

开篇 做任何系统都离不开和绕不过权限的控制,尤其是B/S系统工作原理的特殊性使得权限控制起来更为繁琐,所以就在想是否可以利用IIS的工作原理,在IIS处理客户端请求的某个入口或出口通过判断URL来达到控制权限的目的,这样就可以减少通常要在每个页面或按钮都要添加的权限验证代码. 通常的权限验证模式 一般的权限验证会控制到菜单(页面)就可以满足,复杂一点的会要求控制到按钮(功能点),这个都需要做一下几点工作: 1.按权限生成菜单,这是所有系统都要做的: 2.在每个页面的开始处添加登录和权限的验证,调

权限组件之录入数据

权限组件之录入数据 1.新建一个django项目 rbac 2.增加一个app应用 3.什么是rbac??? 生成表 4.3张表一写,会生成5张表 5.数据库迁移 6.查看表,没有我们自己写的表???都是自带的表 7.settings配置 8.入口文件 9.重新数据化迁移,查看表 admin  添加数据 10.添加数据   admin 11.创建管理员,用户名.(邮箱可以不用填写).密码 12.登入admin 13.默认没有我们自己写的app里的表,需要注册才会显示表 14.第三张表不用加. 1

权限组件之录入获取登入用户的所有权限

权限组件之录入获取登入用户的所有权限 1.urls.py 2.views.py get请求 3.login.html 页面 post请求 4.用户名或密码错误重新登入 验证用户名密码 登入成功之后做什么呢??? session 5.登入成功可以写session值,下次查看别的页面就知道是谁了. pk指的的主键 6.查看 django_session 表 随机字符串={user_id=3,}   通过取当前用户的id--->然后就可以取当前用户的所有信息. 获取当前用户的所有权限 7.获取当前用户

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

在上一篇文章中我们已经分析了认证组件源码,我们再来看看权限组件的源码,权限组件相对容易,因为只需要返回True 和False即可 代码 1 class ShoppingCarView(ViewSetMixin, APIView): 2 permission_classes = [MyPermission, ] 3 def list(self,request, *args, **kwargs): 4 """ 5 查看购物车信息 6 :param args: 7 :param k

RESTful-rest_framework认证组件、权限组件、频率组件-第五篇

认证组件格式: 1 写一个认证类 from rest_framework.authentication import BaseAuthentication class MyAuth(BaseAuthentication): def authenticate(self,request): # request 是封装后的 token = request.query_params.get('token') ret = models.UserToken.objects.filter(token=toke

RestFramework之序列化组件

一.restframework的序列化组件的使用 1.导入序列化组件与模型类 from rest_framework import serializers from app01.models import ( Book, Author, Publish ) 2.书写序列化类 # 创建一个序列化类 class BookSerializer(serializers.Serializer): ''' 开始使用序列化 - 导入模块:from rest_framework import serialize

DAY99 - Rest Framework(四)- 认证组件和权限组件

一.认证组件 1.使用 # 模型层 class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) class UserToken(models.Model): user = models.OneToOneField(to='User') token = models.CharField(max_length=64) #myAuth.py from app