gpt4 book ai didi

django-rest-framework - 使用 DjangoObjectPermissionsFilter 使用 django-guardian 过滤用户的对象

转载 作者:行者123 更新时间:2023-12-04 19:03:13 26 4
gpt4 key购买 nike

我能够设置 django-guardian和我的 django-rest-framework项目为 example in drf docs ,但我未能实现我想要的行为。有人可以指出我是否做错了什么,或者我想要的东西不能用 guardian 完成吗? ?

设置

设置.py

INSTALLED_APPS = (
...
'guardian',
'simple',
)

AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'guardian.backends.ObjectPermissionBackend',
)

'DEFAULT_PERMISSION_CLASSES': (
'infrastructure.permissions.DjangoObjectPermissions',
)

基础设施.permissions.py

from rest_framework import permissions


class DjangoObjectPermissions(permissions.DjangoObjectPermissions):
"""
Similar to `DjangoObjectPermissions`, but adding 'view' permissions.
"""
perms_map = {
'GET': ['%(app_label)s.view_%(model_name)s'],
'OPTIONS': ['%(app_label)s.view_%(model_name)s'],
'HEAD': ['%(app_label)s.view_%(model_name)s'],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': ['%(app_label)s.delete_%(model_name)s'],
}

模型.py

class Event(models.Model):
name = models.CharField(max_length=255)
min_age = models.IntegerField()

def __str__(self):
return self.name

class Meta:
permissions = (('view_event', 'Can view event'),)

View .py

class EventViewSet(viewsets.ModelViewSet):
queryset = models.Event.objects.all()
serializer_class = serializers.EventSerializer
filter_backends = (filters.DjangoObjectPermissionsFilter,)

预期行为
  • Events名单返回者 EventViewSet.list仅包含请求用户可以查看的对象(请求用户具有 django.auth view_event 权限或 ('view_event', event_object) .
  • EventViewSet.details返回 Event仅当请求用户具有 view_event 时才实例许可或 ('view_event', event_object)允许。

  • 实际行为
  • 如果用户有 django auth 权限 view_event和监护人许可('view_event', event_obj) ,可以访问路由list (获取所有条目)和 detailsevent_obj 相关联.
  • 如果用户没有授权权限 view_event ,但有监护人权限('view_event', event_obj) ,他们在所有路由中都会收到 403(包括与他们有权限的 event_obj 关联的 details 路由)。
  • 如果用户有 view_event但没有 ('view_event', event_obj) ,他们可以访问路由list (查看所有条目),但他们在 details 中收到 404路由,不管正在访问的条目。

  • 谢谢!

    最佳答案

    好的,原来所有具有权限类的 View DjangoObjectPermissions如果用户拥有 ,将只允许用户查看给定资源模型级和对象级 权限。我的用户能够列出所有对象,但不能检索任何对象,这是因为 known bug这已经得到纠正,但目前尚未发布。

    关于django-rest-framework - 使用 DjangoObjectPermissionsFilter 使用 django-guardian 过滤用户的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31713455/

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