1. 程式人生 > 其它 >DRF許可權

DRF許可權

許可權的原始碼

 # 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欄位)