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,)
现在,只需将您的权限文件导入到您想要使用此逻辑的任何位置,而无需复制任何代码
我按照文档实施了 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,)
现在,只需将您的权限文件导入到您想要使用此逻辑的任何位置,而无需复制任何代码