2014-08-28 190 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