Django REST_framework框架 03

权限组件

源码

权限组件的源码执行过程和之前的认证组件是相同的,如下:

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)
            )

思考:如果要做权限认证,我们首先要知道当前登录的用户是谁,那么我们如何知道呢?
首先rest_framework中的三个组件是按顺序执行的:

#认证组件
self.perform_authentication(request)
#权限组件
self.check_permissions(request)
#频率组件
self.check_throttles(request)

在第一个执行的认证组件源码中有这样一段代码

self.user, self.auth = user_auth_tuple

这个user_auth_tuple恰巧就是我们自定义认证视图时返回的那个元祖

class TokenAuth(BaseAuthentication):
def authenticate(self, request):
......
return token_obj.user, token_obj.token #需要返回一个元组

因此此时的self.user=token_obj.user,self.auth=token_obj.token

局部视图权限

在app01.service.permissions.py中:

from rest_framework.permissions import BasePermission
class SVIPPermission(BasePermission):
    message = "SVIP才能访问" #没通过验证则返回错误
    def has_permission(self, request, view): #固定写法
        if request.user.user_type == 3:
            return True
        return False

在views.py:

class AuthorView(viewsets.ModelViewSet):
    authentication_classes = [TokenAuth,]
    permission_classes = [SVIPPermission,]
    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers

全局视图权限

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
    "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",]
}

猜你喜欢

转载自blog.51cto.com/dzm911/2345109