Аутентификация Django Rest Framework в viewsets.ViewSet - нужны разные разрешения для каждого метода
У меня возникла проблема с Django REST Framework и viewsets.ViewSet. Я пытаюсь использовать декоратор @permission_classes для защиты определенных методов внутри ViewSet, но, похоже, это работает не так, как ожидалось. Когда я применяю декоратор, все методы требуют аутентификации, даже если я указываю другие разрешения для других методов. Однако если я устанавливаю атрибут permission_classes в верхней части ViewSet, все работает как ожидалось, но мне нужны разные разрешения для каждого метода.
У вас есть совет, как мне добиться разрешений на уровне методов в наборе ViewSet?
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.decorators import action, permission_classes
from rest_framework.response import Response
class ProjectViewSet(viewsets.ViewSet):
# Works as expected: all methods require authentication
permission_classes = (IsAuthenticated,)
@action(detail=False, methods=['get'], url_path='my')
def list_investors_projects(self, request):
# This method should be protected but allows access without authentication
data = {
'message': "This is a custom GET method!",
'status': 'success'
}
return Response(data)
@action(detail=False, methods=['get'], url_path='public', permission_classes=[AllowAny])
def public_projects(self, request):
# This method allows public access
data = {
'message': "Public projects",
'status': 'success'
}
return Response(data)
Я попробовал использовать декоратор @permission_classes над методом list_investors_projects для требования аутентификации и пользовательских разрешений. Я ожидал, что этот конкретный метод будет требовать аутентификации, а другие методы в наборе ViewSet - нет. Однако даже с декоратором метод разрешает доступ без аутентификации.
Я также попробовал установить атрибут permission_classes в верхней части ViewSet на (IsAuthenticated,), и хотя это обеспечило безопасность всех методов, это не позволило мне указать различные разрешения для отдельных методов.
Я ожидаю, что разрешения на уровне метода в наборе ViewSet позволят мне контролировать доступ в зависимости от цели метода. Что я упускаю или делаю неправильно?