2016-08-08 14 views
1

私はspring-security core v4.1.1.RELEASEを使用するspring-bootアプリケーション(spring-boot v1.3.3.RELEASE)を持っています。Spring Securityはフィルタの自動注入を行いますか?

私がOncePerRequestFilterまたはGenericFilterBeanを拡張してカスタムフィルタBeanを作る場合、私のフィルタが自動的に関わらず、私はカスタムにconfigure()に渡されたHttpSecurityオブジェクトにaddFilter()を呼び出すかどうかの、フィルタチェインに追加されるようですWebSecurityConfigurerAdapterクラス。ここで

は、カスタムフィルタコードである:ここで

@Component 
public class CustomFilter extends GenericFilterBean { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     // custom filter code here 
    } 
} 

は省略セキュリティの設定コードです:

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 

     // not adding the custom filter here 

     http.authorizeRequests() 
       .antMatchers("/api/login/**").permitAll() 
       .anyRequest().authenticated(); 
    } 
} 

私が観察していると、すべての要求が、でも/api/loginに、CustomFilterを通過するということです私はそれをどこでもフィルターチェーンに追加しませんでしたが、 @Configurationまたは@Bean注釈なしでCustomFilterと宣言すると、明示的にそれをSecurityConfigurationクラスに通知しない限り、フィルタチェーンに追加されません。

私の質問:これは意図した動作ですか?もしそうなら、なぜですか?フィルターチェーンにフィルターを自動的に追加するのは危険です。より良い単語がないため、各要求はSecurityConfigurationで指定した内容に関係なくフィルターを通過します。

答えて

1

主な違いは、あなたが言うように定期的なフィルタを追加すると、メインサーブレットコンテナのフィルタチェーンに追加され、HttpSecurity.addFilter(Filter)を通してフィルタを追加すると、セキュリティFilterChainProxyに追加されることです。フィルタチェーンプロキシは、基本的には、プロキシ内部のフィルタに委譲するFilter実装内の独自のフィルタチェーンです。したがって、フィルタはセキュリティフィルタに干渉しません。 ビットを説明するために、それはこのようなものになるだろう:

  1. は、customFilter
  2. FilterChainProxy(SessionFilter、BasicAuthFilter、など)
  3. OtherCustomFilter
  4. OtherFilterChainProxy(OAuth2Filter、など)

サーブレットコンテナには4つのフィルタがあります。 2つのカスタムフィルタと2つのSpringセキュリティ設定。 FilterChainProxyに到達すると、プロキシは、コンフィグレーションでそのセキュリティコンフィグレーションがリクエストURLを傍受できるようにする場合にのみ、内部チェーン内の最初のフィルタに委任します。

+0

理にかなっていること、説明するためのおかげで。これが文書化されているかどうか知っていますか?私は少しの検索を行い、カスタムフィルターBeanがメインサーブレットフィルターチェーンに自動的に追加されることを示すソースを見つけることができませんでした。 – Steven

0

はい、春ブーツのドキュメンテーションは、次の言葉:To add a Servlet, Filter, or Servlet *Listener provide a @Bean definition for it.source

手動で使用してフィルタを無効にすることができます。

@Bean 
public FilterRegistrationBean registration(@Qualifier("customFilter") Filter filter) { 
    FilterRegistrationBean registration = new FilterRegistrationBean(filter); 
    registration.setEnabled(false); 
    return registration; 
} 
関連する問題