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



我能够设置django-guardian和我的django-rest-framework项目作为drf文档中的示例,但我未能实现我想要的行为。有没有人可以指出,如果我做错了什么,或者如果我想要的不能与guardian完成?

设置>

settings.py

INSTALLED_APPS = (
    ...
    'guardian',
    'simple',
)
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'guardian.backends.ObjectPermissionBackend',
)
'DEFAULT_PERMISSION_CLASSES': (
    'infrastructure.permissions.DjangoObjectPermissions',
)

infrastructure.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'],
    }

models.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'),)

views.py

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

  • EventViewSet.list返回的Events列表只包含请求用户可以查看的对象(请求用户拥有django)。auth view_event permission OR ('view_event', event_object) .
  • EventViewSet.details仅在请求用户具有view_event('view_event', event_object)权限时返回Event实例。

实际行为

  • 如果用户有django授权权限view_event和守护权限('view_event', event_obj),它可以访问与event_obj关联的路由list(获取所有条目)和details
  • 如果用户没有授权权限view_event,但有监护权限('view_event', event_obj),则在所有路由(包括与他们有权限的event_obj关联的details路由)中收到403。
  • 如果用户有view_event但没有('view_event', event_obj),他们可以访问路由list(看到所有条目),但他们在details路由中收到404,无论正在访问哪个条目。

谢谢!

好的,结果是所有具有权限类DjangoObjectPermissions的视图只允许用户在具有模型级和对象级权限时查看给定的资源。我的用户能够列出所有对象,但无法检索其中任何一个,这是因为一个已知的错误,该错误已经纠正,但当前版本还没有。

相关内容

  • 没有找到相关文章

最新更新