Django REST 框架:使用对象级权限而不使用模型级权限
Django REST framework: using object-level permissions without model-level permissions
我有一个 Django 项目 API 基于 Django REST framework.
最近我在我的项目中使用 django-guardian. However I'm not using model-level permissions framework 启用了对象级权限(直到这一刻我还没有看到任何目的。)
现在,当我在 API 视图集中打开 DjangoObjectPermissions 时,
class PhotoViewSet(viewsets.ModelViewSet)
permission_classes = (permissions.DjangoObjectPermissions,)
并向端点发出更新请求,以获取具有来自 Guardian 框架的适当 "change" 权限的对象,我收到了 403 FORBIDDEN
响应。
此响应的原因似乎在于 request dispatch stage:
- 在这种情况下,DRF 检查模型权限。
DjangoObjectPermissions
继承自 DjangoModelPermissions
.
- DRF 调用
DjangoObjectPermissions.has_permission()
has_permission()
失败,因为我没有使用模型级权限。
在我的情况下,DjangoObjectPermissions
的正确使用方法是什么?
- (A) 实施自定义权限 class,从
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 端点列表被过滤)。我不会依赖它来解决您的问题。
我有一个 Django 项目 API 基于 Django REST framework.
最近我在我的项目中使用 django-guardian. However I'm not using model-level permissions framework 启用了对象级权限(直到这一刻我还没有看到任何目的。)
现在,当我在 API 视图集中打开 DjangoObjectPermissions 时,
class PhotoViewSet(viewsets.ModelViewSet)
permission_classes = (permissions.DjangoObjectPermissions,)
并向端点发出更新请求,以获取具有来自 Guardian 框架的适当 "change" 权限的对象,我收到了 403 FORBIDDEN
响应。
此响应的原因似乎在于 request dispatch stage:
- 在这种情况下,DRF 检查模型权限。
DjangoObjectPermissions
继承自DjangoModelPermissions
.- DRF 调用
DjangoObjectPermissions.has_permission()
has_permission()
失败,因为我没有使用模型级权限。
在我的情况下,DjangoObjectPermissions
的正确使用方法是什么?
- (A) 实施自定义权限 class,从
DjangoObjectPermissions
继承并覆盖has_permission()
. - (B) 为此打开 Django 的模型级权限框架。
- (C) 使用此
hackworkaround 跳过检查。
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 端点列表被过滤)。我不会依赖它来解决您的问题。