zoukankan      html  css  js  c++  java
  • 小谈DRF之权限相关

    2. 权限

    先抛出一个问题:不同的视图不同的权限可以访问。比如:订单相关视图只允许SVIP才能访问。

    2.1 权限的简单实现(Django版本)

    class OrderView(APIView):
        """订单相关(只有SVIP可以访问)"""
    
        authentication_classes = [Authentication, ]
    
        def get(self, request, *args, **kwargs):
            # print(request.user) # ---> UserInfo object
            # print(request.auth) # ---> UserToken object
            if request.user.user_type != 3:
                return HttpResponse('无权访问')
            ret = {'code': 10000, 'msg': None, 'data': None}
            try:
                ret['data'] = ORDER_DICT
            except Exception as e:
                pass
            return JsonResponse(ret)
    

    当用普通账号的token测试后的结果为:

    image-20200908230116984

    当用SVIP账号的token测试后的结果为:

    image-20200908230229828

    2.2 权限的简单使用(restframwork版本)

    还是上面的简单问题,现在用restframework的权限相关功能实现:

    class MyPermission(object):
        def has_permission(self, request, view):
            if request.user.user_type != 3:
                return False
            return True
    
    from django.http import HttpResponse
    
    class OrderView(APIView):
        """订单相关(只有SVIP可以访问)"""
    
        authentication_classes = [Authentication, ]
        permission_classes = [MyPermission, ]
    
        def get(self, request, *args, **kwargs):
            # print(request.user) # ---> UserInfo object
            # print(request.auth) # ---> UserToken object
            ret = {'code': 10000, 'msg': None, 'data': None}
            try:
                ret['data'] = ORDER_DICT
            except Exception as e:
                pass
            return JsonResponse(ret)
    

    当用普通账号的token测试后的结果为:

    image-20200908230906185

    当用SVIP账号的token测试后的结果为:

    image-20200908230937591

    2.3 权限源码流程分析

    1 前面的源码分析和认证相关的一样,只是在initial()方法中,涉及到了权限的源码:

    image-20200908233908987

    2 点开check_permissions()方法,查看其源码:

    image-20200908234247114

    2.1.1 点开get_permissions()方法,查看其源码:

    image-20200908234041162

    2.1.2 发现权限的源码和认证的源码几乎一样,而且点开permission_classes的源码发现权限的全局设置和认证的全局设置也是一样的:

    image-20200908234155920

    2.2.1 如果权限认证失败,走到了permission_denied()方法,查看其源码,就是抛出异常:

    image-20200908234447944

    2.4 权限的配置文件

    由上面的2.1.2发现,权限的全局配置或者局部配置与认证的全局配置或局部配置是一样的。

    2.5 权限的内置类

    或者叫 rest framework基于内置类实现的权限控制

    ​ 点击from restframework.permissons import BasePermission中的BasePermission我们可以看出也是和认证的内置类几乎一样,所以以后我们在写自定义的权限类时应该继承于BasePermission;还有就是无论是认证还是权限,我们几乎用不到内置类,如果项目有需求都是要自己按需求写的,所以了解即可。

    image-20200908235216408

    再次点开BasePermission类,查看其源码:

    image-20200908235254427
  • 相关阅读:
    Aboat join
    ajax 弹出层
    如何使用 BindingSource 绑定 ListBox,同时解决绑定 List<T> 后修改数据源不能同时刷新界面显示的问题
    Javascript 弹出层
    vs 2008 90 天 试用 破解
    c#的as类型转换详细理解,欢迎园友拍砖。
    Linux下定时切割Mongodb数据库日志并删除指定天数前的日志记录
    纠结了一天多的问题arithmetic overflow error converting expression to data type datetime
    关于开发Office2003AddIn问题
    为什么Scrum不行。。
  • 原文地址:https://www.cnblogs.com/richard_A/p/13818088.html
Copyright © 2011-2022 走看看