2014-08-28 3 views
3

Я создал файл разрешений для разрешения isOwnerOrReadOnly, но функция has_object_permission вообще не вызывается (у меня есть там задание печати).Django Rest Framework игнорирует мои разрешения 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 (также в PUT, DELETE) .Использование это в get_object

obj = get_object_or_404(queryset, **filter) 
self.check_object_permissions(self.request, obj) 
+0

Спасибо за этот ответ !!! – andi

2

Я был вдохновлен статьей How I could delete any video on YouTube и хотел проверить, если в моем Джанго проекте все работает безопасно, и в конечном итоге здесь.

Это довольно важный вопрос! И ответ очень хороший.

Django Rest Framework делает ложное впечатление, что все работает нормально, когда вы просматриваете его через просматриваемый API-интерфейс.

объекта, который пользователь владеет Аутентифицировать: enter image description here

объект, который аутентификации пользователя делает НЕ владеет: enter image description here

Hidden DELETE кнопка заставляет вас чувствовать, что все в порядке.

Вы аутентифицированы, кнопка удаления скрыта. Прохладный! Вы не знаете, пока не проверите его с помощью CURL или какого-нибудь другого инструмента и не заметите это огромное отверстие безопасности.

Джанго иногда слишком много магии ....

Пример:

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/ например

обеспечивают ЗНАК пользователь не владеющим объект.

Если все в порядке, вы должны увидеть «деталь»: «У вас нет разрешения на выполнение этого действия."

enter image description here

Смежные вопросы