drf 三大認證之 許可權元件
阿新 • • 發佈:2020-09-17
許可權元件 self.check_permissions(request) 認證細則: def check_permissions(self, request): # 遍歷許可權物件列表得到一個個許可權物件(許可權器),進行許可權認證 for permission in self.get_permissions(): # 許可權類一定有一個has_permission許可權方法,用來做許可權認證的 # 引數:許可權物件self、請求物件request、檢視類物件 # 返回值:有許可權返回True,無許可權返回Falseif not permission.has_permission(request, self): self.permission_denied( request, message=getattr(permission, 'message', None) )
系統許可權類: 1)AllowAny: 認證規則全部返還True:return True 遊客與登陸使用者都有所有許可權 2) IsAuthenticated: 認證規則必須有登陸的合法使用者:return bool(request.user and request.user.is_authenticated) 遊客沒有任何許可權,登陸使用者才有許可權 3) IsAdminUser: 認證規則必須是後臺管理使用者:return bool(request.user and request.user.is_staff) 遊客沒有任何許可權,登陸使用者才有許可權 4) IsAuthenticatedOrReadOnly 認證規則必須是隻讀請求或是合法使用者: return bool( request.methodin SAFE_METHODS or request.user and request.user.is_authenticated ) 遊客只讀,合法使用者無限制
區域性使用許可權類: # api/views.py from rest_framework.permissions import IsAuthenticated class TestAuthenticatedAPIView(APIView): permission_classes = [IsAuthenticated] def get(self, request, *args, **kwargs): return APIResponse(0, 'test 登入才能訪問的介面 ok') # 因為預設全域性配置的許可權類是AllowAny # settings.py REST_FRAMEWORK = { # 許可權類配置 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.AllowAny', ], }
自定義許可權類: 建立四步走: 1) 建立繼承BasePermission的許可權類 2) 實現has_permission方法 3) 實現體根據許可權規則 確定有無許可權 規則: i.滿足設定的使用者條件,代表有許可權,返回True ii.不滿足設定的使用者條件,代表有許可權,返回False 4) 進行全域性或區域性配置 from rest_framework.permissions import BasePermission from django.contrib.auth.models import Group class MyPermission(BasePermission): def has_permission(self, request, view): # 只讀介面判斷 r1 = request.method in ('GET', 'HEAD', 'OPTIONS') # group為有許可權的分組 group = Group.objects.filter(name='管理員').first() # groups為當前使用者所屬的所有分組 groups = request.user.groups.all() r2 = group and groups r3 = group in groups # 讀介面大家都有許可權,寫介面必須為指定分組下的登陸使用者 return r1 or (r2 and r3) # 遊客只讀,登入使用者只讀,只有登入使用者屬於 管理員 分組,才可以增刪改 from utils.permissions import MyPermission class TestAdminOrReadOnlyAPIView(APIView): permission_classes = [MyPermission] # 所有使用者都可以訪問 def get(self, request, *args, **kwargs): return APIResponse(0, '自定義讀 OK') # 必須是 自定義“管理員”分組 下的使用者 def post(self, request, *args, **kwargs): return APIResponse(0, '自定義寫 OK')