DjangoObjectPermissions

DjangoObjectPermissions

我有一个基于 Django REST framework 的带有 API 的 Django 项目。

最近我使用 django-guardian 启用了对象级权限。但是我还没有在我的项目中使用 model-level permissions framework (直到这一刻我没有看到任何目的。)

现在,当我在 API View 集中打开 DjangoObjectPermissions 时,

class PhotoViewSet(viewsets.ModelViewSet)
    permission_classes = (permissions.DjangoObjectPermissions,)

并向端点发出来自 Guardian 框架的具有适当“更改”权限的对象的更新请求,我收到 403 FORBIDDEN 响应。

此响应的原因似乎在于 request dispatch stage :

在这种情况下,
  • DRF 检查模型权限。
  • DjangoObjectPermissions 继承自 DjangoModelPermissions
  • DRF 调用 DjangoObjectPermissions.has_permission()
  • has_permission() 失败,因为我没有使用模型级权限。

  • 在我的情况下使用 DjangoObjectPermissions 的正确方法是什么?
  • (A) 实现自定义权限类,从 DjangoObjectPermissions 继承并覆盖 has_permission()
  • (B) 只是为了它而打开 Django 的模型级权限框架。
  • (C) 使用这个 hack workaround 跳过检查。
  • 最佳答案

    DjangoObjectPermissions 的实现方式期望用户能够编辑模型并有权编辑该模型的实例。

    >>> from django.contrib.auth.models import User, Group
    >>> user = User.objects.get(pk=1)
    >>> admins = Group.objects.get(pk=1)
    >>> user.has_perm('change_group')
    False
    >>> user.has_perm('change_group', admins)
    True
    

    管理模型权限可能会给您的项目增加(用户管理)开销。如果您对项目的其余部分有需求并计划使用它,我建议只走这条路线。

    相反,创建一个完全适合您需求的自定义权限类似乎是最好的类(class)。它可以很简单:
    class ObjectOnlyPermissions(DjangoObjectPermissions):
    
        def has_permission(self, request, view):
            return True
    

    您引用的解决方法没有记录,看起来是为了解决内部问题(APIRootView 端点列表被过滤)。我不会依靠这个来解决你的问题。

    关于python - Django REST 框架 : using object-level permissions without model-level permissions,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34371409/

    10-13 06:43