Django REST框架:使用对象级权限而不使用模型级权限



我有一个Django项目,该项目使用基于Django REST框架的API。

最近,我使用django-guardian启用了对象级权限。然而,我还没有在我的项目中使用模型级权限框架(直到现在我还没有看到任何目的。)

现在,当我在我的API视图集中打开DjangoObjectPermissions时,

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

并从Guardian框架向具有适当"更改"权限的对象的端点发出更新请求,我得到了403 FORBIDDEN响应。

这种响应的原因似乎在于请求调度阶段:

  1. 在这种情况下,DRF会检查模型权限
  2. CCD_ 2继承自CCD_ 3
  3. DRF调用DjangoObjectPermissions.has_permission()
  4. has_permission()失败,因为我没有使用模型级别的权限

在我的情况下,使用DjangoObjectPermissions的正确方法是什么?

  • (A) 实现一个自定义权限类,从DjangoObjectPermissions继承并重写has_permission()
  • (B) 打开Django的模型级权限框架就是为了它
  • (C) 使用此破解解决方法跳过检查

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 ObjectOnlyPermissions(DjangoObjectPermissions):
    def has_permission(self, request, view):
        return True

您引用的解决方法没有文档,看起来是为了解决内部问题(正在筛选APIRootView端点列表)。我不会靠这个来解决你的问题。

相关内容

  • 没有找到相关文章

最新更新