Пользовательское разрешение Django rest framework для ViewSet

это мой modelViewSet

class UserViewSet(viewsets.ModelViewSet):
    def list(self, request):
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def create(self, request):
        serializer = UserSerializer(data=request.data)

        if serializer.is_valid(raise_exception=True):
            pass

    def retrieve(self, request, pk):
        user = get_object_or_404(User, pk=pk)
        serializer = UserSerializer(user)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def get_permissions(self):
        if self.action == "list":
            permission_classes = [
                IsAdminUser,
            ]
        elif self.action == "create":
            permission_classes = [AllowAny]
        else:
            permission_classes = [AccountOwnerPermission]

        return [permission() for permission in permission_classes]
 

и это класс пользовательских разрешений

class AccountOwnerPermission(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        print(object)
        print(request.user)
        return obj == request.user

я получаю доступ к этому представлению от другого пользователя, и оно показывает мне, что я получаю пользователя, и что 2 отпечатка на AccountOwnerPermission не запускается. кто-нибудь может сказать мне, что не так с тем, что я сделал и почему has_object_permission не запускается.

я изменил has_object_permission на has_permission и это работает, но у меня нет доступа к obj с другой стороны

От docs:

Если вы пишете собственные представления и хотите обеспечить разрешения на уровне объектов, или если вы переопределяете метод get_object в общем представлении, тогда вам нужно будет явно вызвать метод .check_object_permissions(request, obj) в представлении в тот момент, когда вы получили объект.

Так что вам нужно будет вызвать check_object_permissions в вашем retrieve, чтобы иметь возможность вызвать has_object_permission:

    def retrieve(self, request, pk):
        user = get_object_or_404(User, pk=pk)
        self.check_object_permissions(request, user) # Add this line
        serializer = UserSerializer(user)
        return Response(serializer.data, status=status.HTTP_200_OK)
Вернуться на верх