Аутентифицирован, но получаешь 403 — DRF так и задуман

Кандидат на мидл+ путает два разных слоя DRF: аутентификацию и права доступа. Получив 403 вместо 401, начинает чинить токен, хотя токен уже прошёл проверку — проблема в другом классе.

Классы аутентификации (SessionAuthentication, TokenAuthentication, JWT-пакеты) отвечают только на вопрос «кто ты» и кладут объект пользователя в request.user. Если аутентификация не прошла — ответ 401, Unauthorized, запрос не опознан.

Классы permissions работают после: они получают уже опознанного request.user и решают, можно ли ему именно это действие. IsAuthenticated пропустит любого опознанного пользователя, а кастомный IsOwner или IsAdminUser может отказать — и это уже 403, Forbidden: «я знаю, кто ты, но тебе сюда нельзя».

class PolicyViewSet(viewsets.ModelViewSet): authentication_classes = [TokenAuthentication] permission_classes = [IsAuthenticated, IsOwner]

def get_queryset(self): return Policy.objects.filter( client=self.request.user )

Throttling добавляет третий слой — он может вернуть 429 ещё до того, как запрос дойдёт до permissions, если включён троттлинг по IP или по пользователю. Пагинация на этот конвейер не влияет напрямую, но часто спрашивают следом: что произойдёт, если permission_classes пуст — DRF по умолчанию пропустит всех, если явно не задан DEFAULT_PERMISSION_CLASSES в settings. Это частая причина случайно открытого эндпоинта в проде.

401 — ты не опознан, 403 — опознан, но тебе нельзя. Перепутать эти коды в ответе на собесе — минус балл сразу.

Тренажёр: 1900+ вопросов и задач, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки