Можно ли вывести экземпляр has_object_permission?

Я пытаюсь создать REST API с помощью django-rest-framework. Мой вопрос в том, могу ли я распечатать экземпляр метода has_object_permission, чтобы я мог видеть, что происходит в этой части. Я пытаюсь сделать так, чтобы только владелец объекта мог обновлять и удалять объект, но сейчас любой может удалить или обновить любой объект. Пожалуйста, подскажите, есть ли другой способ сделать это помимо прав доступа. Можно ли сделать все это с помощью проверок в сериализаторе. Если да, то, пожалуйста, объясните мне это на примере. Я буду очень благодарен.

class ObjectOwnerPermission(BasePermission):

    message = "This object is expired." # custom error message

    def has_object_permission(self, request, view, obj):
        
        if request.user.is_authenticated:
            return True
        return False

        if obj.author == request.user:
            return True
        return False


class RetrieveUpdateProjectAPIView(generics.RetrieveUpdateAPIView,ObjectOwnerPermission):
    """This endpoint allows for updating a specific Project by passing in the id of the 
Project to update/Retrieve"""
    permissions_classes = [ObjectOwnerPermission]
    queryset = Project.objects.all()
    serializer_class = serializers.ProjectSerializer

class DeleteProjectAPIView(generics.DestroyAPIView,ObjectOwnerPermission):
    """This endpoint allows for deletion of a specific Project from the database"""
    permissions_classes = [ObjectOwnerPermission]
    queryset = Project.objects.all()
    serializer_class = serializers.ProjectSerializer

Ваши разрешения не работают, потому что вы возвращаете True в ObjectOwnerPermission, когда пользователь аутентифицирован, что означает, что ЛЮБОЙ, кто аутентифицирован, может передать это разрешение.

РЕДАКТИРОВАНИЕ: В исходном вопросе permissionS_classes использовалось вместо permission_classes

Вот моя исправленная версия:

class ObjectOwnerPermission(BasePermission):

    message = "This object is expired." # custom error message

    def has_object_permission(self, request, view, obj):    
        return obj.author == request.user


class RetrieveUpdateProjectAPIView(generics.RetrieveUpdateAPIView):
    """This endpoint allows for updating a specific Project by passing in the id of the 
Project to update/Retrieve"""
    permission_classes = [IsAuthenticated, ObjectOwnerPermission]
    queryset = Project.objects.all()
    serializer_class = serializers.ProjectSerializer

class DeleteProjectAPIView(generics.DestroyAPIView):
    """This endpoint allows for deletion of a specific Project from the database"""
    permission_classes = [IsAuthenticated, ObjectOwnerPermission]
    queryset = Project.objects.all()
    serializer_class = serializers.ProjectSerializer
  • НЕ НАСЛЕДУЙТЕ от класса permission в ваших представлениях - он должен использоваться только в permission_classes
  • .
  • если вы хотите выстроить цепочку разрешений, она должна быть реализована в permission_classes list
  • .
  • классы разрешений читаются слева направо, что означает, что сначала проверяется IsAuthenticated перед вашим классом (в вашем классе вы уверены, что пользователь вошел в систему)
Вернуться на верх