ソースコード権の06 DRF分析

ソースコード権の06 DRF分析

1.簡単な権利

  • 権限と認証制限と一緒に、要求がアクセスを許可されるべきかどうかを判断します。
  • パーミッションチェックは常にビューの最初に実行し、他のコードを実行することが許可されています。パーミッションのチェックは頻繁に使用するrequest.userrequest.auth、属性認証情報は、着信要求を許可すべきかどうかを判断します。
  • グラントやユーザーの異なるクラスの権限を拒否するには、APIのさまざまな部分にアクセスできます。

使用2.許可

  • カスタムクラスの認証局

    from rest_framework.permissions import BasePermission
    from rest_framework import exceptions
    
    class MyPermission(BasePermission):
        message = {'code': 10001, 'error': '你没权限'}
        def has_permission(self, request, view):
            """
            Return `True` if permission is granted, `False` otherwise.
            """
            if request.user:
                return True
    
            # raise exceptions.PermissionDenied({'code': 10001, 'error': '你没权限'})
            return False
    
        def has_object_permission(self, request, view, obj):
            """
            Return `True` if permission is granted, `False` otherwise.
            """
            return False
  • プラスpermission_classesは許可認定クラスが必要です

    class OrderView(APIView):
        permission_classes = [MyPermission,]
        def get(self,request,*args,**kwargs):
            return Response('order')
    
    
    class UserView(APIView):
        permission_classes = [MyPermission, ]
        def get(self,request,*args,**kwargs):
            return Response('user')

3.ソースコード解析

  • ディスパッチ要求は、最初の実行方法を来ました

    class APIView(View):
        permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
    
        def dispatch(self, request, *args, **kwargs):
            # 封装request对象...
            self.initial(request, *args, **kwargs)
            # 通过反射执行视图中的方法...
  • 最初の移行方法

      def initial(self, request, *args, **kwargs):
            # 版本的处理...
            # 认证...       
            # 权限判断
            self.check_permissions(request)
    
            self.check_throttles(request) # 节流...
  • クラスのオブジェクト権限の認証機関が続くcheck_permissions方法、

    def check_permissions(self, request):
        # [对象,对象,]
        for permission in self.get_permissions():
            if not permission.has_permission(request, self):
                self.permission_denied(request, message=getattr(permission, 'message', None))
  • get_permissionsメソッド、オブジェクトリストへのアクセス権クラスのインスタンス

    def get_permissions(self):
        return [permission() for permission in self.permission_classes]
  • 自己has_permission権限定義されたクラスを行う方法は、アクセス許可かどうかを決定します

    class MyPermission(BasePermission):
        def has_permission(self, request, view):
            if request.user:
                return True
            return False

4.まとめ

  1. ユーザは、初期メソッドcheck_permissionsの方法によって実行される最初のディスパッチ実行方法上要求されたとき
  2. すべてのクラスの特権とは、インスタンス化されたオブジェクトのリストを見つけるために
  3. 循環リストオブジェクトのインスタンス、各オブジェクトの実行方法のhas_permission
  4. 戻り値TrueとFalseの認定権限がエラーメッセージをカスタマイズすることができます

おすすめ

転載: www.cnblogs.com/liubing8/p/11941211.html