DRF - 如何在查询集上实现基于对象的权限?

DRF - how to implement object based permission on queryset?

我按照文档实施了 DRF。有一次我发现,一旦用户通过身份验证,该用户就可以获取系统中任何用户的数据。

我已根据 this 文档实施过滤。

我通读了许可文档,但找不到根据所有者过滤掉查询集的方法。在我的其中一个视图中,我正在检查所有者是否与请求的用户相同。

我的问题是,我是否必须在所有视图集中执行相同的操作?或者有一种通用的方法可以检查这种情况?

不确定,这是否是最好的方法,但我通过覆盖 get_queryset

来实现
def get_queryset(self):
    queryset = YOUR_MODEL.objects.filter(user_id=self.request.user.id)
    return queryset

这样做,使用权限 class

class IsInUserHierarchy(permissons.BasePermission):
     def has_permission(self, request, view):
        return bool(isinstance(request.user, UserClassHierarchy))

一些解释。 IsInUserHierarchy class 与 IsAdminUser 非常相似。它检查 request.user 是否在所需的 class 中(从模型导入 UserClassHierarchy),使用简单的 python isinstance() 方法

只需创建一个权限文件,然后添加如下内容:

class IsOwner(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        # Instance must have an attribute named `owner`.
        return obj.owner == request.user

然后,在您的 ViewSet 中,使用此权限 class:

class MyViewSet(viewsets.ViewSet):
    permission_classes = (IsOwner,)

现在,只需将您的权限文件导入到您想要使用此逻辑的任何位置,而无需复制任何代码