2017-09-05 32 views
1

各タイプの認証に別々のWebSecurityConfigurerAdapterを使用して、アプリケーションに複数の認証タイプを設定しようとしています。複数のWebSecurityConfigurerAdapterおよびFilter Chains

一般的な考え方は、WebSecurityConfigurerAdapter configure(HttpSecurity http)メソッドを使用してURLパターンを照合し、専用の専用フィルター(許可を含む)を使用してすべての認証を行うことです。

@Configuration 
@EnableWebSecurity 
public class DemoMultipleWebSecurityConfigurerAdapter { 

    @Order(1) 
    @Configuration 
    public static class BasicSecurityAdapter extends WebSecurityConfigurerAdapter { 

     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      String endpointPattern = "/api/basic/**"; 
      http.requestMatchers().antMatchers(endpointPattern); 
      http.csrf().ignoringAntMatchers(endpointPattern); 
      http.authorizeRequests().antMatchers(endpointPattern).authenticated(); 


      http.addFilterBefore(new MyBasicAuthFilter(), LogoutFilter.class); 
     } 
    } 

    @Order(2) 
    @Configuration 
    public static class SSOSecurityAdapter extends WebSecurityConfigurerAdapter { 
     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      String endpointPattern = "/api/sso/**"; 
      http.requestMatchers().antMatchers(endpointPattern); 
      http.csrf().ignoringAntMatchers(endpointPattern); 
      http.authorizeRequests().antMatchers(endpointPattern).authenticated(); 


      http.addFilterBefore(new MySSOAuthFilter(), LogoutFilter.class); 
     } 
    } 
} 

初期化中に、私はしかしと呼ばれるフィルター・チェーンを実行時に各WebSecurityConfigurerAdapterは(独自のフィルター・チェーンを持っていると仮定されている)を設定するHttpSecurityの別のインスタンスを取得していることがわかりますが常にのために作成したものです最初のWebSecurityConfigurerAdapterはどのエンドポイントで呼び出すかにかかわらず。

ドキュメントによると、SpringはHttpSecurityインスタンスを使用して(URLパターンに従って)フィルタリングする正しいフィルタチェーンを見つけることになっています。

私が間違っていることに関するアイデアはありますか? (私はこれをテストするためにSpring 1.5.6-RELEASEを使用しています)

答えて

1

複数のものは必要ありませんWebSecurityConfigurerAdapter;一致するURLパターンに対してのみ動作するようにフィルタを設定してください。つまり、すべてのフィルタを追加しますが、条件付きでフィルタを動作させます。

+0

これは、SpringがSpringに登録したFilterの中の適切なFilterにルーティングするために使用しているのと同じマッチングコンポーネントを使用していたことです。 –