Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем