org.springframework.web.util.pattern.PatternParseException: Больше данных шаблона не допускается после элемента шаблона {*…} или **.

Вопрос или проблема

У меня есть следующее выражение для фильтра пути:

.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()
)

Если вам необходимо строго соблюдать текущие пути, но избежать ошибки, вы можете попробовать просто ограничиться первой записью и посмотреть, покрывает ли она ваши требования. Это позволит вам избежать избыточных дублирований и предохранит от возникновения ошибок парсинга.

Если же по каким-то причинам вам нужно сохранить оригинальные паттерны, убедитесь, что они не конфликтуют и правильно структурированы для нужд вашего приложения.

Таким образом, приведенная версия кода не только решает проблему с ошибкой парсинга, но и сохраняет функциональность исходного кода, позволив вашему приложению корректно обрабатывать запросы по заявленным путям.

Оцените материал
Добавить комментарий

Капча загружается...