django - Django Rest Framework check_object_permissions 未被调用
问题描述
我试图确保用户有权查看他们正在调用的对象。这是我的权限类:
from rest_framework import permissions
class IsOwner(permissions.BasePermission):
"""
Custom permission to only allow owners of an object to do actions.
"""
message = 'You must be the owner of this object.'
def has_object_permission(self, request, view, obj):
print("CHECK THAT I GOT HERE")
return obj.user == request.user
这是我的视图集:
class TopLevelJobViewSet(ModelViewSet):
permission_classes = (IsOwner,)
serializer_class = TopLevelJobSerializer
queryset = TopLevelJob.objects.all()
filter_backends = [DjangoFilterBackend, RelatedOrderingFilter]
filter_class = TopLevelJobFilter
ordering_fields = '__all__'
没有被调用,任何访问端点的has_object_permissions
人都可以访问所有对象。
为什么是这样?我怎样才能has_object_permissions
被叫到?
这篇文章:Django rest framework ignores has_object_permission谈论它是一个没有GenericAPIView
. 但ModelViewSet
有GenericViewSet
哪个有generics.GenericAPIView
。有什么东西在某个地方覆盖了这个吗?
编辑:我的问题是我打电话list
而不是get
. 我怎样才能只返回list
属于用户的对象?
这个链接:https ://www.django-rest-framework.org/api-guide/filtering/#filtering-against-the-current-user表明我可以实现这样的东西:
def get_queryset(self):
username = self.kwargs['username']
return Purchase.objects.filter(purchaser__username=username)
如果我必须将它添加到每个视图集中,这似乎违反了 DRY。有没有办法把它变成permissions
我可以随时调用的课程?
解决方案
您可以实现自定义通用过滤 [drf-doc]。例如:
class IsOwnerFilter(filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
return queryset.objects.filter(user=request.user)
然后您可以将其添加到您的ModelViewSet
:
class TopLevelJobViewSet(ModelViewSet):
permission_classes = (IsOwner,)
serializer_class = TopLevelJobSerializer
queryset = TopLevelJob.objects.all()
filter_backends = [IsOwnerFilter, DjangoFilterBackend, RelatedOrderingFilter]
filter_class = TopLevelJobFilter
ordering_fields = '__all__'
推荐阅读
- csv - 旧版本的 iMacros 是否有“文件访问扩展名”来使用 .CSV?
- javascript - 如何在 JavaScript 中找到最近的小时的 LEFT 秒或 PAST 秒?
- java - Spring Boot 的 Spring Security 默认凭据是什么?
- javascript - 如何隐藏/保护我的客户端 HTML/JS 代码?
- flutter - 如何提示用户在颤动中注销?
- c# - 使用 Visual Studio 16.3.2 模板创建 Razor 类库时出现问题
- java - 我需要帮助在 java 中进行更改。它没有正确发出变化
- reactjs - 在 TypeScript 模块解析期间未找到 Material-UI 组件
- apache-kafka - Kafka 控制台生产者消息大小
- c++ - 了解可变参数模板