zoukankan      html  css  js  c++  java
  • Django REST framework之权限组件实例以及源码流程分析

    抛出实际问题

    基于上一个认证例子抛出问题:就是如果有多种用户种类,但是要对不同种类的用户设置权限,每一类的用户查看的内容应该是不一样的。

    只需要我们写一个权限类,继承BasePermission基类。

     1 from rest_framework.permissions import BasePermission
     2 
     3 
     4 class Mypermission(BasePermission):
     5     message = '必须是svip'
     6 
     7     def has_permission(self, request, view):
     8         if request.user.user_type == 3:
     9             return True
    10         return False

    视图和路由匹配跟认证例子同。

    全局设置权限:

     1 REST_FRAMEWORK = {
     2     # 认证
     3     'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.auth.Authticate', ],
     4     # 'DEFAULT_AUTHENTICATION_CLASSES': [],  # AnonymousUser None配置文件中有
     5     # 'UNAUTHENTICATED_USER': lambda: '匿名用户',
     6     # 'UNAUTHENTICATED_USER': None,
     7     # 'UNAUTHENTICATED_TOKEN': None,
     8     # 权限
     9     'DEFAULT_PERMISSION_CLASSES': ['api.utils.permission.Mypermission'],
    10     # 节流 访问频率控制
    11     "DEFAULT_THROTTLE_CLASSES": ['api.utils.throttle.VisitThrottle', ],
    12     "DEFAULT_THROTTLE_RATES": {
    13         "baidu": '3/m',
    14         "baiduUser": '10/m',
    15     }
    16 
    17 }

    局部设置权限:

    如果全局不配置,那就在局部类视图加上

    1 permission_classes = [Mypermission, ]

    权限组件源码流程分析

    自己没有--->APIView的dispatch--->封装request---->执行initial----->执行self.check_permissions(request)------>循环所有权限对象self.get_permissions()----->执行权限类的has_permission(request, self)方法。(分两种情况:返回True通过权限,返回False不能通过)如果是返回Flase--->进入if条件体执行内部的self.permission_denied()方法--->通过反射获取当前权限对象的错误信息。message=getattr(permission, 'message', None)

    内置权限类

    BasePermission 写权限类规范必须继承此类 has_permission has_object_permission

    AllowAny  通过所有

    IsAuthenticated 只允许通过认证的用户的

    IsAdminUser

    IsAuthenticatedOrReadOnly

    DjangoModelPermissions

    DjangoModelPermissionsOrAnonReadOnly

    DjangoObjectPermissions

    以上几个都是基于Django源生写的权限

    总结:自定义权限类时,实现has_permission方法, has_object_permission是访问用户对某个对象有权限

     
  • 相关阅读:
    控制一个cell不可被移动到另外一个section中
    core data 手动修改 .xcodatamodeld 文件 和 po 生成的 模型类 注意事项
    stringByTrimmingCharactersInSet 取出string 前后空格
    项目架构简述
    nil NULL [NSNULL null]
    如何定义一个应用之间调用的ios 本地URL
    UITableView隐藏多余的分割线
    解决UItableView cell的间隔线 separatorStyle ( plain group 两种类型)
    模拟器 真机 测试 内存消耗 资源对比
    微服务架构:Eureka集群搭建
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11296372.html
Copyright © 2011-2022 走看看