Django (DRF): Как применить аутентификацию в представлении на основе класса?
В моем проекте Django есть две группы пользователей:
- Менеджер
- Сотрудник
Теперь я пытаюсь создать представление на основе класса, которое возвращает всех менеджеров. Однако оно должно быть доступно только менеджерам. Если сотрудник или анонимный пользователь попытается получить к нему доступ, он должен вернуть код 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]