Вопрос с собеседования · Spring

В конфигурации указано сначала anyRequest().authenticated(), а затем requestMatchers("/public/**").permitAll(). Что получится?

MiddleSpring Security
Ещё спрашивают так:
  • Почему permitAll не срабатывает в Spring Security?
Коротко

Первое совпавшее правило выигрывает: anyRequest().authenticated() перехватит всё, включая /public/**. В Spring Security 6 такая конфигурация падает при старте — anyRequest обязан стоять последним.

  • Сначала конкретные пути, потом общие
  • permitAll для статики и публичных API — до anyRequest
  • Разные правила для частей приложения — разные SecurityFilterChain

А ещё Отладка — TRACE-логи Spring Security

Подробно

Правила авторизации образуют упорядоченный список, и Spring Security применяет первое, чей матчер подошёл к запросу — специфичность роли не играет. Поэтому порядок пишут от частного к общему, а anyRequest ставят завершающим. В свежих версиях Spring Security подобная ошибка обычно ловится при старте с сообщением о недостижимом правиле, но полагаться на это не стоит. Хорошая практика — завершать цепочку именно anyRequest().authenticated() или denyAll(), реализуя принцип запрета по умолчанию: новый эндпоинт тогда закрыт, пока для него явно не описано правило.

Что хотят услышать

  • Правило первого совпадения.
  • Правильный порядок.

Частые ошибки

  • Ожидать, что более конкретный матчер победит независимо от позиции.
  • Забыть завершающее правило и оставить часть путей без явной политики.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Более специфичное правило автоматически получит приоритет независимо от порядка объявления
  • ✗Обе строки применятся, и доступ будет открыт
  • ✗Конфигурация не скомпилируется
  • ✓Срабатывает первое подходящее правило, поэтому и /public потребует аутентификации

Что спросят дальше

  • Почему завершать цепочку denyAll безопаснее?
  • Чем правила авторизации отличаются от method security?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования