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>