您的位置:首页 > 编程语言 > Go语言

Django REST_framework框架 03

2019-01-21 17:12 721 查看

权限组件

源码

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

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",]
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Django framework 框架