Spring Security: как использовать несколько шаблонов URL в FilterRegistrationBean?

У меня есть фасоль

@Bean
public FilterRegistrationBean animalsFilterRegistration() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new AnimalsFilter());
    registration.addUrlPatterns(
        "/api/cat",
        "/api/cat/**",
        "/api/dog"
    );
    ...
    return registration;
}

В этом компоненте я использую два шаблона для URL-адресов /api/cat**. Проблема в том, что когда я пытаюсь вызвать конечные точки со сложным postfix (/api/cat/1/feed), мой фильтр не перехватывает запрос. Но это нормально, когда я вызываю /api/cat и /api/got endpoints - фильтр работает так, как ожидалось, и перехватывает запросы.

Как использовать несколько шаблонов URL для моего случая (/api/cat, /api/cat/**)?

PS

Я попытался использовать следующие комбинации шаблонов:

1) /api/cat, /api/cat**, /api/dog
2) /api/cat, /api/cat/**, /api/dog
3) /api/cat**, /api/dog

Ответы

Ответ 1

Как уже упоминалось @Tarun Lalwani, вам нужно использовать * вместо **, потому что ** в этом случае не является допустимым шаблоном url.

В вашем случае попробуйте следующее:

    registration.addUrlPatterns(
        "/api/cat",
        "/api/cat/*",
        "/api/dog",
        "/api/dog/*"
    );

они будут соответствовать /api/cat/1, /api/cat/1/feed, /api/dog/1, /api/dog/1/feed ,...

Если вы хотите реплицировать поведение /api/* которое было бы, только match /api/this но /api/not/that, то вам нужно использовать следующий шаблон: /api/*/.

Ответ 2

Если вы посмотрите на документацию

https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/api/org/springframework/boot/web/servlet/FilterRegistrationBean.html

Если URL-адрес или сервлеты не заданы, фильтр будет связан с '/*'

Как вы видите *, используется шаблон spring а не **. ** обычно является глобусом, используемым bash, golang. Но весна использует * только. Так что вам нужно просто

registration.addUrlPatterns(
        "/api/cat",
        "/api/cat/*",
        "/api/dog",
        "/api/dog/*"
    );

** шаблоны обычно используются в фильтрах безопасности

https://docs.spring.io/spring-security/site/docs/current/reference/html/security-filter-chain.html#filter-chain-proxy

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
<constructor-arg>
    <list>
    <sec:filter-chain pattern="/restful/**" filters="
        securityContextPersistenceFilterWithASCFalse,
        basicAuthenticationFilter,
        exceptionTranslationFilter,
        filterSecurityInterceptor" />
    <sec:filter-chain pattern="/**" filters="
        securityContextPersistenceFilterWithASCTrue,
        formLoginFilter,
        exceptionTranslationFilter,
        filterSecurityInterceptor" />
    </list>
</constructor-arg>
</bean>