如何在Django Rest Framework中过滤具有权限的用户相关记录

时间:2016-02-23 15:18:33

标签: django django-rest-framework

我需要知道如何限制对经过身份验证的用户的访问,以便可以完全列出以管理员身份登录的用户记录,对于以用户身份登录的用户,只能列出,更新和创建他们的记录。

目前我正在使用serializers.ModelSerializer,viewsets.ModelViewSet和permissions.BasePermission,但似乎无法快速到达任何地方。

2 个答案:

答案 0 :(得分:4)

使用魔棒没有开箱即用的方法处理此类权限。虽然有一些库可以处理对象级权限,但请检查django-guardian,因为它与Django rest Framework有很好的接口。

处理这个问题的一个好方法是将django-guardian的功能与@ ilse2005的答案所描述的自定义get_queryset()方法相结合。这会照顾您的listretrieve,并且可以将更新和删除委托给django-guardian

class View(ModelViewSet):
    ...

    def get_queryset(self):
        if self.request.user.is_superuser:
            return FooModel.objects.all()
        return FooModel.objects.filter(owner=self.request.user)

这也适用于DRF中的APIViews和其他基于类的视图。

警告:如果您的API使用者依赖于HTTP错误代码意味着这种方法会抛弃404而不是HTTP403,这是一种说明权限被拒绝的标准方式。在这种情况下,建议编写自定义权限类。例如,以下ip黑名单权限类直接来自文档 - http://www.django-rest-framework.org/api-guide/permissions/

from rest_framework import permissions

class BlacklistPermission(permissions.BasePermission):
    """
    Global permission check for blacklisted IPs.
    """

    def has_permission(self, request, view):
        ip_addr = request.META['REMOTE_ADDR']
        blacklisted = Blacklist.objects.filter(ip_addr=ip_addr).exists()
        return not blacklisted

通过设置类变量

在视图集中使用此类

permission_classes = BlackListPermission

答案 1 :(得分:2)

您可以通过覆盖get_queryset

ModelViewSet方法来实现
class View(ModelViewSet):
    ...

    def get_queryset(self):
        if self.request.user.is_superuser:
            return FooModel.objects.all()
        return FooModel.objects.filter(owner=self.request.user)

这假设您的FooModel ForeignKeyowner UserModellist

编辑:

上述方法仅适用于retrieveupdate。对于{{1}}方法,您必须编写自定义权限。