2014-08-28 192 views
3

我创建了一个文件的权限为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,) 

我缺少什么?

回答

3

@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) 
+0

感谢您的回答! – andi 2015-04-04 22:23:54

2

我的文章How I could delete any video on YouTube 的灵感,并要检查,如果在我的Django项目一切工作的安全,并在这里结束了。

这是非常重要的问题! 答案非常好。

Django Rest Framework使得假象,一切工作正常,当一个人通过浏览的API观点看它。

对象,验证用户拥有其中: enter image description here

对象,它验证用户确实拥有: enter image description here

隐藏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提供的用户不拥有令牌对象。

,如果一切正常,你应该看到“细节”:“您没有权限执行此操作。“

enter image description here