Spring Security:如何在FilterRegistrationBean中使用多个URL模式?

Ale*_*lex 12 java spring spring-security servlet-filters

我有一个豆子

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

在那个bean中,我使用了两种/api/cat**URL 模式.问题是,当我尝试使用复杂的postfix(/api/cat/1/feed)调用端点时,我的过滤器不会拦截请求.但是当我调用/api/cat/api/got端点时它是可以的- 过滤器按预期工作并拦截请求.

如何为我的案例(/api/cat,/api/cat/**)使用多个URL模式?

PS

我试图使用下一个模式组合:

1) /api/cat, /api/cat**, /api/dog
2) /api/cat, /api/cat/**, /api/dog
3) /api/cat**, /api/dog
Run Code Online (Sandbox Code Playgroud)

Twi*_*wiN 6

正如@Tarun Lalwani所提到的,你需要使用*而不是**,因为**在这种情况下它不是一个有效的url模式.

在您的情况下,请尝试以下操作:

    registration.addUrlPatterns(
        "/api/cat",
        "/api/cat/*",
        "/api/dog",
        "/api/dog/*"
    );
Run Code Online (Sandbox Code Playgroud)

那些将匹配/api/cat/1,/api/cat/1/feed,/api/dog/1,/api/dog/1/feed,...

如果要复制/api/*,将只匹配的行为/api/this,但是/api/not/that,那么你就需要使用以下模式:/api/*/.


Tar*_*ani 6

如果你看一下文档

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

如果未指定URL模式或servlet,则过滤器将与"/*"关联

正如你所看到的*是使用的模式spring,而不是**.**通常由使用的水珠bash,golang.但春天*只使用.所以你需要的只是

registration.addUrlPatterns(
        "/api/cat",
        "/api/cat/*",
        "/api/dog",
        "/api/dog/*"
    );
Run Code Online (Sandbox Code Playgroud)

这些**模式通常用于安全过滤器

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>
Run Code Online (Sandbox Code Playgroud)