Django (DRF): Как применить аутентификацию в представлении на основе класса?

В моем проекте Django есть две группы пользователей:

  1. Менеджер
  2. Сотрудник

Теперь я пытаюсь создать представление на основе класса, которое возвращает всех менеджеров. Однако оно должно быть доступно только менеджерам. Если сотрудник или анонимный пользователь попытается получить к нему доступ, он должен вернуть код 403-HTTP-Status. Пока что я создал представление на основе класса, и для простоты оно расширяется generics.ListAPIView. Но я не могу найти способ применить желаемую аутентификацию.

Я снял разрешения "Can view group" и "Can view user" с группы Employee, поэтому ни один сотрудник не может просматривать менеджеров. Я пробовал несколько классов permission_classes, но каждый раз, когда я отправлял GET-запрос с токеном сотрудника через Insomnia, он возвращал менеджеров вместо кода 403-Status. За помощь буду очень признателен.

Вот код представления:

class ViewManager(generics.ListAPIView):
    permission_classes = [DjangoModelPermissions]
    group = Group.objects.get(name='Manager')
    users = group.user_set.all()
    queryset = users
    serializer_class = ManagerSerializer

Чтобы дать разрешение на доступ к представлению определенной группе, можно использовать следующую команду:

def my_view(request):
   if request.user.groups.filter(name='Manager').exists(): 
      print("User is Manager")

Вы можете создать собственный класс разрешения:

from rest_framework import permissions
from django.contrib.auth.models import Group

class IsManager(permissions.BasePermission):
    def has_permission(self, request, view):
        if not request.user.is_authenticated: # Exclude anonymous users
            return False
        return request.user.groups.filter(name='Manager').exists()

и вы можете использовать его следующим образом:

class ViewManager(generics.ListAPIView):
    permission_classes = [IsManager]
    ...

Вы можете создать пользовательский класс разрешения следующим образом DRF Permission docs

class HasManagerPerms(permissions.BasePermission):
      def has_permission(self, request, view):
          if request.user.is_authenticated and request.user.is_manager
             return True

и добавьте это к вашему представлению так

permission_classes = [HasManagerPerms]




 
Вернуться на верх