DRF Custom Permission не запускается - PullRequest
0 голосов
/ 10 апреля 2020

Я написал собственный класс разрешений для проекта drf для защиты моего представления:

views.py

class Employee(APIView):
    permission_classes = [BelongsToClient]
    serializer_class = EmployeeSerializer

    def get(self, request, pk, format=None):
        employee = EmployeeModel.objects.get(pk=pk)
        serializer = EmployeeSerializer(employee, many=False)
        return Response(serializer.data)

    def delete(self, request, pk, format=None):
        employee = EmployeeModel.objects.get(pk=pk)
        employee.Employees_deleted = True
        employee.save()
        return Response(status=status.HTTP_200_OK)

Мой класс разрешений:

allow.py

from rest_framework import permissions

class BelongsToClient(permissions.BasePermission):
    message= "You are only authorized to view objects of your client"

    """
    Object-level permission to only see objects of the authenticated users client
    """

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

К сожалению, этот класс разрешений не блокирует мое представление, даже когда оно должно. Я не знаю почему. Я что-то пропустил?

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Вам нужно вызвать метод check_object_permissions перед ответом на APIView

class Employee(APIView):
    permission_classes = [BelongsToClient]
    serializer_class = EmployeeSerializer

    def get(self, request, pk, format=None):
        employee = EmployeeModel.objects.get(pk=pk)
        serializer = EmployeeSerializer(employee, many=False)
        self.check_object_permissions(request, employee)
        return Response(serializer.data)
1 голос
/ 10 апреля 2020

has_object_permission вызывается только при использовании DestroyAPIView или RetrieveAPIView или ViewSet.

. Попробуйте использовать видовой набор, как показано ниже

from rest_framework import viewsets

class Employee(viewsets.ViewSet):
    permission_classes = [BelongsToClient]
    serializer_class = EmployeeSerializer

    def delete(self, request, pk, format=None):
        employee = EmployeeModel.objects.get(pk=pk)
        self.check_object_permissions(request, employee)
        employee.Employees_deleted = True
        employee.save()
        return Response(status=status.HTTP_200_OK)

Примечание: I не проверял, но это должно работать.

...