3

我有一个基于Django REST 框架的 API 的 Django 项目。

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

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

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

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

此响应的原因似乎在于请求调度阶段

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

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

  • (A) 实现一个自定义权限类,继承DjangoObjectPermissions并覆盖它has_permission()
  • (B) 为了它而打开 Django 的模型级权限框架。
  • (C) 使用这个hack 变通方法跳过检查。
4

1 回答 1

4

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 端点列表被过滤)。我不会依靠这个来解决你的问题。

于 2015-12-19T22:10:55.943 回答