gpt4 book ai didi

python - Django REST 框架 : using object-level permissions without model-level permissions

转载 作者:行者123 更新时间:2023-11-28 22:39:49 25 4
gpt4 key购买 nike

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

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

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

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

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

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

  1. 在这种情况下,DRF 检查模型权限。
  2. DjangoObjectPermissions 继承自 DjangoModelPermissions
  3. DRF 调用 DjangoObjectPermissions.has_permission()
  4. 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 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com