DRF 自定义权限:允许 'retrieve'、拒绝 'list'

DRF custom permission: allow 'retrieve', deny 'list'

tldr:我想获得许可,允许 'retrieve' 操作但不允许 'list'。

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

在创建端点时遇到困难,该端点应该 return 站点用户:

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

-普通用户应该只能'retrieve'和'patch'他自己的帐户

我找不到区分 GET 请求 'list' 和 'retrieve' 的方法。 检查 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?

尝试在你的 mixin 中使用 self.action 方法。它会给你列出、检索、更新、销毁你的操作方法,

检查权限时,Django Rest 将视图传递给权限 class 方法,从视图中您可以确定操作。您可以在源代码 here.

中查看 has_object_permissionRetrieveAPIView 的示例

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

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

您可以在 has_object_permission 中检查 view.action 以获得您想要的结果。