web-dev-qa-db-ja.com

Spring Security:FilterRegistrationBeanで複数のURLパターンを使用する方法は?

私は豆を持っています

@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に2つのパターンを使用しています。問題は、複雑な接尾辞(/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
12
Alex

ドキュメントを見れば

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

URLパターンまたはサーブレットが指定されていない場合、フィルターは「/ *」に関連付けられます。

ご覧のとおり、*springによって使用されるパターンであり、**ではありません。 **は通常、bashgolangによって使用されるグロブです。ただし、春は*のみを使用します。だからあなたが必要なのはただ

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>
6
Tarun Lalwani

@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/*のみに一致するが/api/thisに一致する、/api/not/thatの動作を複製する場合は、次のパターンを使用する必要があります:/api/*/

6
TwiN