我想在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:我确定我错过了什么,我的问题很天真,但我看不清楚。答案 0 :(得分:1)
我担心框架不能以这种方式工作......权限是拒绝访问(当条件满足时),而不是为您过滤对象。如果需要返回特定对象,则需要根据当前用户(如果需要)在视图(queryset)中对其进行过滤。
答案 1 :(得分:0)
根据你的表现,改写不是很糟糕......但这不是问题。
如果我完全理解您要做的是使用自定义权限过滤您的查询集。
我建议,为了使您的代码明确而简单,请覆盖您的后端过滤器,如doc
但要小心filter_queryset
适用于retrieve
和list
方法