DRF許可權
阿新 • • 發佈:2021-06-11
許可權的原始碼
# APIView --->dispatch ---> initial ---> self.perform_authentication(request)(APIView的物件方法) 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(): # 許可權類一定有一個has_permission許可權方法,用來做許可權認證的 # 引數:許可權物件self、請求物件request、檢視類物件 # 返回值:有許可權返回True,無許可權返回False if not permission.has_permission(request, self): self.permission_denied( request, message=getattr(permission, 'message', None), code=getattr(permission, 'code', None) )
許可權的使用
# 寫一個類,繼承BasePermission,重寫has_permission,如果許可權通過,就返回True,不通過就返回False from rest_framework.permissions import BasePermission class UserPermission(BasePermission): def has_permission(self, request, view):# 不是超級使用者,不能訪問 # 由於認證已經過了,request內就有user物件了,當前登入使用者 user = request.user # 當前登入使用者 # 如果該欄位用了choice,通過get_欄位名_display()就能取出choice後面的中文 print(user.get_user_type_display()) if user.user_type == 1: return True else: return False # 區域性使用 class TestView(APIView): permission_classes = [app_auth.UserPermission] # 全域性使用 REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ["app01.app_auth.MyAuthentication", ], 'DEFAULT_PERMISSION_CLASSES': ["app01.app_auth.UserPermission"], } # 區域性禁用 class TestView(APIView): permission_classes = []
內建許可權的使用
# 演示一下內建許可權的使用IsAdminUser # 1 建立超級管理員 # 2 寫一個測試檢視類 # 演示內建許可權 超級管理員可以檢視 from rest_framework.permissions import IsAdminUser from rest_framework.authentication import SessionAuthentication class TestView3(APIView): authentication_classes = [SessionAuthentication] permission_classes = [IsAdminUser] def get(self, request, *args, **kwargs): return Response("這是測試資料2222222 超級管理員可以看") # 3 超級使用者登入到admin,再訪問test3就有許可權 # 4 正常的話,普通管理員沒有許可權看(判斷的是is_staff欄位)