【问题标题】:Django rest framework queryset custom permissionsDjango rest框架查询集自定义权限
【发布时间】:2016-01-10 12:50:52
【问题描述】:

我想在我的 django rest 框架视图上使用 django Guardian 设置自定义权限。我已经成功地为RetrieveModelMixin 实现了它,但不是ListModelMixin

我有一个看起来像这样的权限类:

class CustomPerm(permissions.BasePermission):
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated()

    def has_object_permission(self, request, view, object):
        if request.method == 'GET':
            if object.public is True:
                return True

            if object.user.is_staff is True:
                return True

            if 'read_object' in get_perms(request.user, object):
                return True

            return False

        if request.method == 'POST':
            #...

我也简化了这里的视图:

@authentication_classes((TokenAuthentication, SessionAuthentication, BasicAuthentication,))
@permission_classes((CustomPerm,))
class ObjectView(ListModelMixin,
                 RetrieveModelMixin,
                 viewsets.GenericViewSet):
    queryset = myObject.objects.all()
    serializer_class = ObjectSerializer

我天真地期待的行为:ListModelMixin 可以根据 CustomPerm has_object_permission 规则自行过滤对象。

但它不是那样工作的。我可以通过编写get_queryset 方法并应用我的自定义权限规则来做我想做的事,但这似乎不合适而且很糟糕。

有没有更好的方法?谢谢:)

PS:我确定我遗漏了一些东西,我的问题很幼稚,但我看不出是什么。

【问题讨论】:

    标签: django permissions django-rest-framework django-guardian


    【解决方案1】:

    恐怕框架不能那样工作......权限在那里拒绝访问(当满足条件时),但不是为您过滤对象。如果需要返回特定对象,则需要根据当前用户在视图(查询集)中过滤它们(如果需要)。

    【讨论】:

    • 我已经实现了一个基于过滤器的解决方案,它使用您所描述的权限,这就是我所需要的。我只是遇到了“权限”语义的问题,但现在可以了。谢谢你们两个:)
    • 很高兴听到这个消息!祝你好运!
    【解决方案2】:

    根据您的操作方式,覆盖并不可怕......但这不是问题。

    如果我理解你想要做的是使用你的自定义权限过滤你的查询集。

    我的建议是,为了让您的代码保持清晰和简单,请像 doc 中那样覆盖您的后端过滤器

    但要小心 filter_queryset 同时适用于 retrievelist 方法

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 2018-07-03
      • 1970-01-01
      • 2017-04-13
      • 2016-11-20
      • 2015-05-08
      相关资源
      最近更新 更多