Проблема с правами доступа уровня объекта Django Rest Framework при создании объекта через POST - PullRequest
0 голосов
/ 19 сентября 2018

Мои файлы:

BusinessActionsPermission

class BusinessActionsPermission(BasePermission):
    """
    Custom permission to only allow owners of an object to edit it.
    """
    def has_permission(self, request, view):
        return True

    def has_object_permission(self, request, view, obj):
        business_obj = view.get_business_obj()
        if request.method in ['GET']:
            return request.user.has_perm('act_on_business', business_obj)
        if request.method in ['PUT', 'PATCH', 'DELETE']:
            return request.user.has_perm('act_on_business', business_obj)
        return False

EmployeeViewSet

class EmployeeViewSet(viewsets.ModelViewSet):
    serializer_class = EmployeeSerializer
    permission_classes = (permissions.IsAuthenticated, BusinessActionsPermission)

    def get_business_obj(self, **kwargs):
        return Business.objects.filter(pk=self.kwargs['business_id'])

    def get_queryset(self, **kwargs):
        return Employee.objects.filter(business__id=self.kwargs['business_id'])

    def create(self, request, *args, **kwargs):
        business = Business.objects.get(pk=self.kwargs['business_id'])
        employee = Employee(business=business)
        serializer = EmployeePOSTSerializer(employee, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

BusinessActionsPermission не работает, пока вызывается метод POST для создания нового Employee - EmployeeViewSet.Пользователь без act_on_busienss может post и создать сотрудника.

Документация Django Rest Framework здесь говорит:

По причинам производительности общийПредставления не будут автоматически применять разрешения на уровне объектов к каждому экземпляру в наборе запросов при возврате списка объектов.

, что хорошо.Как BusinessActionsPermission работает на detailed retrievals with pk.Но не работает на post, который не list.

Пожалуйста, помогите.

Примечание : BusinessActionsPermission выше отлично работает для детального просмотраи не проверяет вид списка, что совершенно нормально, как указано в документации.Но как насчет post ??

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Если вы посмотрите на реализацию ModelViewSet и generics в rest_framework, вы можете узнать, когда проверяется разрешение объекта.

Метод BusinessActionsPermission has_object_permission вызывается, когда объект извлекается с использованием метода get_object класса GenericAPIView.

Итак, с этим знанием мы можем видеть, что в вашем случае этометод не вызывается при создании нового объекта.

Вам нужно переместить логику с has_object_permission на has_permission.

. Вы можете использовать has_object_permission, чтобы проверить разрешение для определенного объекта, который уже был создан (например,владение например).

0 голосов
/ 19 сентября 2018

, поскольку объекта еще нет, но DRF никогда не вызывает метод has_object_permission, необходимо определить разрешение для метода POST в методе has_permission.

Также обратите внимание, что универсальныйПредставления будут проверять только разрешения уровня объекта для представлений, которые извлекают один экземпляр модели.

В основном разрешение уровня объекта будет проверяться, если был вызван метод get_object. Исходный код drf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...