1. 程式人生 > 實用技巧 >drf 三大認證之 許可權元件

drf 三大認證之 許可權元件

許可權元件
    self.check_permissions(request)
    認證細則:
    def check_permissions(self, request):
        # 遍歷許可權物件列表得到一個個許可權物件(許可權器),進行許可權認證
        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) )
系統許可權類:

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.method
in 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')