抛出实际问题
基于上一个认证例子抛出问题:就是如果有多种用户种类,但是要对不同种类的用户设置权限,每一类的用户查看的内容应该是不一样的。
只需要我们写一个权限类,继承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是访问用户对某个对象有权限