簡體   English   中英

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

[英]Spring Security: How to use multiple URL patterns in FilterRegistrationBean?

我有一顆豆

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

在那個 bean 中,我對/api/cat** URL 使用了兩種模式。 問題是,當我嘗試使用復雜的后綴 ( /api/cat/1/feed ) 調用端點時,我的過濾器不會攔截請求。 但是當我調用/api/cat/api/got端點時沒問題——過濾器按預期工作並攔截請求。

如何為我的案例使用多個 URL 模式( /api/cat/api/cat/** )?

聚苯乙烯

我嘗試使用下一個模式組合:

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

正如@Tarun Lalwani 所提到的,您需要使用*而不是** ,因為在這種情況下**不是有效的網址模式。

在您的情況下,請嘗試以下操作:

    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/this但匹配/api/this /api/not/that/api/*行為,則需要使用以下模式: /api/*/

如果您查看文檔

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

當未指定 URL 模式或 servlet 時,過濾器將關聯到“/*”

如您所見, *spring使用的模式,而不是** **通常是bashgolang使用的 glob。 但是 spring 只使用* 所以你需要的只是

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>

我的問題是:在每個端點調用中都會調用過濾器,忽略我設置的模式:

myBean.setUrlPatterns(Arrays.asList("/cat/*","/dog/*","/serpent/*"));

我在 @SpringBootApplication 類中創建了 bean。

所以如果我調用 http://server/api/animal/elephant 過濾器被命中,我不認為這是預期的行為,因為我已經設置了 url 模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM