DRF игнорирует классы разрешений для владельца - PullRequest
0 голосов
/ 03 октября 2019

Я реализовал BasePermission класс в проекте, но когда я собираюсь получить зарегистрированного пользователя с его токеном, он говорит: You don't have a permission to perform this action

permissions.py

class IsLoggedInOrAdmin(permissions.BasePermission):

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


class IsAdminUser(permissions.BasePermission):

    def has_permission(self, request, view):
        return request.user and request.user.is_staff

    def has_object_permission(self, request, view, obj):
        return request.user and request.user.is_staff

и мой файл просмотров выглядит так

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get_permissions(self):
        permission_classes = []

        if self.action == 'create':
            permission_classes = [AllowAny]
        elif self.action == 'retrieve' or self.action == 'update' or self.action == 'partial_update':
            permission_classes = [IsLoggedInOrAdmin]
        elif self.action == 'destroy' or self.action == 'list':
            permission_classes = [IsAdminUser]

        return [permission() for permission in permission_classes]

вот что я сделал до сих пор. Я создал простого пользователя и взял токен. Если я отправляю запрос GET в Почтальоне, я получаю ошибку детализации, но она отлично работает с токеном суперпользователя, но не владельцем. Где я делаю ошибку? Любая помощь, пожалуйста? Заранее спасибо!

1 Ответ

0 голосов
/ 03 октября 2019

Я отмечаю из DRF Official DOC

Метод has_object_permission уровня экземпляра будет вызываться только в том случае, если проверки has_permission уровня представления уже пройдены. Также обратите внимание, что в порядкедля выполнения проверок на уровне экземпляра код представления должен явно вызывать .check_object_permissions (request, obj)

Я думаю, что здесь вам нужно явно назвать check_object_permission, не передавая has_permission.

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