我想在我的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
行为我naïvly期望:ListModelMixin
可以根据CustomPerm has_object_permission
规则自行过滤对象。
但事实并非如此。我可以通过编写get_queryset
方法并应用我的自定义权限规则来做我想做的事情,但这似乎不合适且糟糕。
有更好的方法吗?谢谢:)
PS:我确信我错过了一些东西,我的问题是naïve,但我看不到什么。
恐怕这个框架不是这样工作的…权限用于拒绝访问(当满足条件时),而不是为您过滤对象。如果需要返回特定对象,则需要根据当前用户在视图(queryset)中对它们进行过滤(如果需要的话)。
重写并不可怕,取决于你怎么做…但这不是问题所在。
如果我理解得好,你想做的是使用你的自定义权限过滤你的查询集。
我的建议是,为了保持你的代码明确和简单,重写你的后端过滤器,就像在doc
但是要注意filter_queryset
同时应用于retrieve
和list
方法