2

我正在使用 Django Rest Framework 和OAuthTookit

我希望令牌提供的范围应该是特定于 HTTP 方法的。例如:- 同一个 APIView 的 GET、PUT、DELETE 应该有不同的范围。

以下是我的 API。

class MyView(RetrieveUpdateDestroyAPIView):
    permission_classes = [TokenHasScope]
    required_scopes = ['scope1']
    serializer_class = ModelSerializer
    queryset = Model.objects.all()

目前,范围设置在类级别,这意味着要访问所有 GET、PUT 和 DELETE 方法,令牌应该具有scope1.

我希望不同的 HTTP 方法应该有不同的范围。如何为不同的方法设置不同的范围?

4

3 回答 3

3

要处理这种情况,我认为您需要实现一个新的权限类,如下所示:

class TokenHasScopeForMethod(TokenHasScope):

     def has_permission(self, request, view):
         token = request.auth

         if not token:
             return False

         if hasattr(token, "scope"):
             # Get the scopes required for the current method from the view
             required_scopes = view.required_scopes_per_method[request.method]

             return token.is_valid(required_scopes)

并像这样在您的视图中使用它:

class MyView(RetrieveUpdateDestroyAPIView):
     permission_classes = [TokenHasScopeForMethod]
     required_scopes_per_method = {'POST': ['post_scope'], 'GET': ['get_scope']}
     serializer_class = ModelSerializer
     queryset = Model.objects.all()
于 2017-11-15T13:26:02.803 回答
2

也许您可以使用TokenMatchesOASRequirements权限类

class SongView(views.APIView):
    authentication_classes = [OAuth2Authentication]
    permission_classes = [TokenMatchesOASRequirements]
    required_alternate_scopes = {
        "GET": [["read"]],
        "POST": [["create"], ["post", "widget"]],
        "PUT":  [["update"], ["put", "widget"]],
        "DELETE": [["delete"], ["scope2", "scope3"]],
    }
于 2020-08-04T08:33:58.557 回答
0

我喜欢@clément-denoix 的答案,但会稍微调整一下。

TokenHasScope.has_permission我建议不要重新 加载,TokenHasScope.get_scopes因为它是更小的方法并且完全适合您的需要。原始has_permission方法还具有我更喜欢保留的其他逻辑。

这样的事情应该可以解决问题:

from django.core.exceptions import ImproperlyConfigured
from oauth2_provider.contrib.rest_framework import TokenHasScope


class TokenHasScopeForMethod(TokenHasScope):
    def get_scopes(self, request, view):

        try:
            scopes = getattr(view, "required_scopes_per_method")
            return scopes[request.method]
        except (AttributeError, KeyError):
            raise ImproperlyConfigured(
                "TokenHasScope requires the view to define the required_scopes_per_method attribute"
            )
于 2021-12-28T18:26:15.030 回答