Django的REST框架无视我IsOwnerOrReadOnly权限
问题描述:
我创建了一个文件的权限为isOwnerOrReadOnly
许可,但has_object_permission功能不会被调用所有(我有地方打印语句那里检查)。Django的REST框架无视我IsOwnerOrReadOnly权限
这是我如何用我的观点此权限:
class CarDetail(generics.RetrieveUpdateDestroyAPIView):
.....
serializer_class = car_serializers.CarSerializer
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.IsAuthenticatedOrReadOnly,IsOwnerOrReadOnly,)
我缺少什么?
答
@adeleinr我猜你已经声明了自己的get_object方法(我会在评论中问你这个问题,但是没有足够的要点去做:D),在这种情况下,你必须使用check_object_permissions在的get_object您的get_object(也PUT,DELETE)。使用本
obj = get_object_or_404(queryset, **filter)
self.check_object_permissions(self.request, obj)
答
我的文章How I could delete any video on YouTube 的灵感,并要检查,如果在我的Django项目一切工作的安全,并在这里结束了。
这是非常重要的问题! 答案非常好。
的Django Rest Framework
使得假象,一切工作正常,当一个人通过浏览的API观点看它。
对象,验证用户拥有其中:
对象,它验证用户确实不拥有:
隐藏DELETE键会让你感觉,一切都很好。
您进行身份验证,删除按钮隐藏。 酷!除非您使用CURL或其他工具进行测试,否则您会不知情,并注意到这个巨大的安全漏洞。
Django是有时过多魔....
实施例:
views.py
@authentication_classes((ExpiringTokenAuthentication, SessionAuthentication))
@permission_classes((IsOwnerOrReadOnly,))
class UserFavouritesSpotDetail(RetrieveUpdateDestroyAPIView):
model = UsersSpotsList
serializer_class = FavouritesSpotsListSerializer
def get_queryset(self):
queryset = UsersSpotsList.objects.filter(
role=1)
return queryset
def get_object(self):
queryset = self.get_queryset()
obj = get_object_or_404(
queryset,
pk=self.kwargs['pk'],
role=1)
self.check_object_permissions(self.request, obj)
return obj
通知书Shivansh提到的关键行:
self.check_object_permissions(self.request, obj)
当我错过了这个漏洞能力是存在的。
permissions.py
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
"""
Object-level permission to only allow owners of an object to edit it.
Assumes the model instance has an `user` attribute.
"""
def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests.
if request.method in permissions.SAFE_METHODS:
return True
return obj.user == request.user
TEST与http://www.getpostman.com/
它e.g提供的用户不拥有令牌对象。
,如果一切正常,你应该看到“细节”:“您没有权限执行此操作。“
感谢您的回答! – andi 2015-04-04 22:23:54