web-dev-qa-db-ja.com

spring security permitAllは、Authorizationヘッダーで渡されたトークンを引き続き考慮し、トークンが無効な場合は401を返します

プロジェクトでSpringSecurity oauthを使用しています。SpringSecurityResourceServerConfigurerAdapterで構成することにより、認証から一部のURLを除外しています。http.authorizeRequests().antMatchers(url).permitAll()を追加しました。

さて、私が見ているのは、AuthorizationヘッダーをこれらのURLに渡さないと、認証されないということです。そして、APIは適切に呼び出されます。

Authorizationヘッダーを使用して呼び出しが行われると、トークンが検証され、トークンが検証されない場合は呼び出しが失敗します。

私の質問は、permitAllを持っているリクエストでトークンが無視されるようにするために何をする必要があるかです。

15
user3565529

Spring OAuth2は、ヘッダー付きのすべてのURLをインターセプトします:Authorization Bearerxxx。

SpringOAuth2がURLをインターセプトしないようにするため。 SpringOAuth2構成よりも高次のSecurityConfigurationを作成しました。

@Configuration
@EnableWebSecurity
@Order(1) // this is important to run this before Spring OAuth2 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        List<RequestMatcher> requestMatchers = new ArrayList<RequestMatcher>();
        // allow /api/public/product/** and /api/public/content/** not intercepted by Spring OAuth2
        requestMatchers.add(new AntPathRequestMatcher("/api/public/product/**"));
        requestMatchers.add(new AntPathRequestMatcher("/api/public/content/**"));

    http
        .requestMatcher(new OrRequestMatcher(requestMatchers))
    .authorizeRequests()
      .antMatchers("/api/public/product/**", "/api/public/content/**").permitAll()
    }
}

上記の構成では、/ api/public/product/**と/ api/public/content/**をSpringOAuth2ではなく、この構成で処理できます。これは、この構成の@Orderが高いためです。

したがって、無効なトークンを上記のapi呼び出しに設定しても、無効なアクセストークンにはなりません。

7
SooCheng Koh

Spring-oauth2 docsによる https://projects.spring.io/spring-security-oauth/docs/oauth2.html

注:承認サーバーがリソースサーバーでもある場合は、APIリソースを制御する優先度の低い別のセキュリティフィルターチェーンがあります。アクセストークンで保護するリクエストの場合、パスがユーザー向けのメインフィルターチェーン内のパスと一致しないようにする必要があるため、上記のWebSecurityConfigurerに非APIリソースのみを選択するリクエストマッチャーを含めるようにしてください。

したがって、ResourceServerConfigよりも高い順序でWebSecurityConfigurerの実装を定義します。

3
hemantvsn