Вопрос или проблема
У меня есть следующее выражение для фильтра пути:
.authorizeHttpRequests(auth ->
auth.requestMatchers("/internal/**", "**/internal/**", "**/internal", "/**/internal/**", "/**/internal").permitAll()
)
Но я получаю исключение:
org.springframework.web.util.pattern.PatternParseException: После элемента шаблона {*...} или ** больше данных шаблона не допускается
Вы знаете, как я могу исправить ошибку, не изменяя выражение пути?
Ответ или решение
Ошибка, которую вы наблюдаете – org.springframework.web.util.pattern.PatternParseException: No more pattern data allowed after {*...} or ** pattern element
, возникает из-за некорректного использования символа *
и его комбинаций в фильтрации путей. В Spring Security спецификация пути позволяет использовать *
и **
, но они должны использоваться корректно и не могут комбинироваться в одном requestMatchers
.
Исходное выражение определяет несколько путей с использованием **
, что может привести к неправильной интерпретации из-за нескольких конфликтующих паттернов. Чтобы устранить эту ошибку и сохранить оригинальное намерение вашего кода, вы должны избегать дублирования путей с **
.
Вот один из возможных подходов к исправлению:
.authorizeHttpRequests(auth ->
auth.requestMatchers(
"/internal/**", // Любые запросы к /internal и его подкаталогам
"/internal", // Запросы к /internal
"/**/internal/**", // Любые запросы, где internal может находиться в любой части пути
"/**/internal" // Запросы к /internal, где internal может находиться в любой части пути
).permitAll()
)
Попробуйте упростить ваши паттерны. Можно начать с удаления некоторых из них и оставить только те, которые строго необходимы. Например, замените все семантически избыточные паттерны одним, который может покрыть все случаи:
.authorizeHttpRequests(auth ->
auth.requestMatchers("/internal/**").permitAll()
)
Если вам необходимо строго соблюдать текущие пути, но избежать ошибки, вы можете попробовать просто ограничиться первой записью и посмотреть, покрывает ли она ваши требования. Это позволит вам избежать избыточных дублирований и предохранит от возникновения ошибок парсинга.
Если же по каким-то причинам вам нужно сохранить оригинальные паттерны, убедитесь, что они не конфликтуют и правильно структурированы для нужд вашего приложения.
Таким образом, приведенная версия кода не только решает проблему с ошибкой парсинга, но и сохраняет функциональность исходного кода, позволив вашему приложению корректно обрабатывать запросы по заявленным путям.