Можно ли вывести экземпляр 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
перед вашим классом (в вашем классе вы уверены, что пользователь вошел в систему)