2016-09-26 5 views
1

2つの異なるフィルタでスプリングセキュリティを設定しようとしています。 私が望むのは、あるフィルタで処理されるいくつかのURLと、他のフィルタによって処理されるいくつかのURLを持つことです。 これは私が思い付いたの設定です:スプリングブートセキュリティ - 2つの異なるフィルタ

FILTER1:

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled=true) 
public class SecurityConfigurationContext { 

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

     @Override 
     protected void configure(final HttpSecurity http) throws Exception { 
      // Handlers and entry points 
      http.exceptionHandling() 
       .authenticationEntryPoint(MyCustomAuthenticationEntryPoint); 


      http.authorizeRequests() 
       .antMatchers(HttpMethod.GET, "/filter1-urls/*").hasRole("USER"); 


      http.addFilterBefore(myCustomFilter1, ChannelProcessingFilter.class); 

      http.csrf().disable(); 
      http.httpBasic() 
       .and() 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
     } 

     @Override 
     protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
      auth.userDetailsService(myCustomAuthenticationService) 
       .passwordEncoder(new BCryptPasswordEncoder()); 
     } 
    } 

    @Order(2) 
    @Configuration 
    public static class ConfigurerAdapter2 extends WebSecurityConfigurerAdapter{ 
     ... 

     @Override 
     protected void configure(final HttpSecurity http) throws Exception { 
      // Handlers and entry points 
      http.exceptionHandling() 
       .authenticationEntryPoint(MyCustomAuthenticationEntryPoint); 


      http.authorizeRequests() 
       .antMatchers(HttpMethod.GET, "/filter2-urls/*").hasRole("SUPER_USER"); 


      http.addFilterBefore(myCustomFilter2, ChannelProcessingFilter.class); 

      http.csrf().disable(); 
      http.httpBasic() 
       .and() 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
     } 

     @Override 
     protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
      auth.userDetailsService(myCustomAuthenticationService) 
       .passwordEncoder(new BCryptPasswordEncoder()); 
     } 
    } 
} 

とフィルタは次のようになり

@Component 
@Order(1) 
public final class MyCustomFilter1 implements Filter{ 

    public MyCustomFilter1() { 
     super(); 
    } 

    @Override 
    public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException { 
     // logic for processing filter1-urls 
    } 
} 

FILTER2:

@Component 
@Order(2) 
public final class MyCustomFilter2 implements Filter{ 

    public MyCustomFilter2() { 
     super(); 
    } 

    @Override 
    public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException { 
     // logic for processing filter2-urls 
    } 
} 

問題は、両方のことですこれらのフィルタのうちの1つは、要求ごとにチェーン内で呼び出されます。私が行うすべてのリクエストは、最初に1つのフィルタを通過し、次にもう1つのフィルタを通過します。

どうすれば修正できますか?

ありがとうございます。

答えて

0

ConfigurerAdapterが1つだけ必要です。

http.exceptionHandling() 
      .authenticationEntryPoint(MyCustomAuthenticationEntryPoint); 
http 
    .authorizeRequests() 
    .antMatchers(HttpMethod.GET, "/filter1-urls/*").hasRole("USER") 
    .antMatchers(HttpMethod.GET, "/filter2-urls/*").hasRole("SUPER_USER"); 
http.addFilterBefore(myCustomFilter, ChannelProcessingFilter.class); 

このような動作を設定したため、両方のフィルタが呼び出されます。必要な結果を得るには、唯一のフィルタを残す必要があります。

@Component 
public final class MyCustomFilter implements Filter { 

    public MyCustomFilter() { 
     super(); 
    } 

    @Override 
    public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException { 
    // logic for processing filter2-urls and filter1-urls 
    } 
} 

とにかく、フィルタはチェーン内で呼び出されます。あなたのフィルタを分割したい場合にのみ必要なURLをフィルタリングするために、あなたのフィルターでif文を追加する必要があります(ServletRequest

@Component 
public final class MyCustomFilter2 implements Filter { 

    public MyCustomFilter2() { 
     super(); 
    } 

    @Override 
    public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException { 
     if (/*is filter2 urls*/) { 
     // logic for processing filter2-urls 
     } 
    } 
} 
+0

うーむからリクエストされたURLを取得することができます。ありがとうございました。私はそれを試してみるとあれば、あなたが知ってもらおう – Lazaruss

+0

Ok。このソリューションは私のために働く。もう一度ありがとう。:) – Lazaruss

関連する問題