【问题标题】:DRF custom permission: allow 'retrieve', deny 'list'DRF 自定义权限:允许“检索”,拒绝“列表”
【发布时间】:2021-09-04 10:08:36
【问题描述】:

tldr:我想获得一个允许“检索”操作但不允许“列表”的权限。

我正在使用 Django Rest Framework 编写 REST API,但在创建自定义权限时遇到了问题(对于来自 viewsets.ModelViewSet 的视图)

在创建一个应该返回站点用户的端点时遇到了困难:

-管理员应该有权访问每个方法

-普通用户应该只能“检索”和“修补”他自己的帐户

我找不到区分 GET 请求“列表”和“检索”的方法。 检查request.method == GET 允许他们两个,但我不希望用户能够列出所有其他用户。

    from rest_framework.permissions import BasePermission

    ```

    def is_superuser(request):
         return request.user.is_superuser
        
    ```

    class IsAdminOrReadOnlyOwner(BasePermission):
        def has_permission(self, request, view):
            if is_superuser(request):
                return True
            else:
                return request.method in ['GET', 'PATCH']
        
        def has_object_permission(self, request, view, obj):
            is_owner_and_safe = int(request.user.id) == obj.id and request.method in ['GET', 'PATCH']
            return is_owner_and_safe or is_superuser(request)

有没有办法做到这一点,仍然使用 ModelViewSet?

【问题讨论】:

    标签: django-rest-framework django-views django-permissions


    【解决方案1】:

    在检查权限时,Django Rest 将视图传递给权限类方法,您可以从视图中确定操作。您可以在源代码here 中查看has_object_permissionRetrieveAPIView 的示例。

    您可以使用view.action 从您的权限类方法中识别操作,例如:

    def has_permission(self, request, view):
        if is_superuser(request):
            return True
        else:
            return view.action in ['retrieve', 'update']
    

    您可以在has_object_permission 中检查view.action 以实现您想要的。

    【讨论】:

      【解决方案2】:

      尝试在你的 mixin 中使用self.action 方法。它将为您提供列表、检索、更新、销毁作为您的操作方法,

      【讨论】:

      • 嗯,我想要一个“即插即用”权限,我可以像permission_classes = [IsAdminOrReadOnlyOwner] 这样粘贴到视图中。那么有没有办法在权限类中做到 100% 呢?
      猜你喜欢
      • 2021-09-17
      • 2015-07-08
      • 1970-01-01
      • 2016-03-29
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多