2016-09-26 8 views
1

Ich versuche, Federsicherheit mit zwei verschiedenen Filtern zu konfigurieren. Ich möchte einige URLs haben, die von einem Filter verarbeitet werden, und einige URLs, die von einem anderen Filter verarbeitet werden. Dies ist die Setup kam ich mit:Spring Boot Sicherheit - zwei verschiedene Filter

@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()); 
     } 
    } 
} 

und Filter wie folgt aussehen:

Filter1:

@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 
    } 
} 

Das Problem, das beide ist Diese Filter werden für jede Anforderung in einer Kette aufgerufen. Jede Anfrage, die ich mache, durchläuft zuerst einen Filter und dann den anderen, und zwar nur durch einen.

Wie behebe ich das?

Vielen Dank im Voraus.

Antwort

0

Sie sollten die einzige ConfigurerAdapter haben. Sie können sie in einer Konfiguration kombinieren:

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); 

Beide Filter werden aufgerufen, weil Sie ein solches Verhalten festlegen. Sie sollten den einzigen Filter zurücklassen, um das gewünschte Ergebnis zu erzielen.

@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 
    } 
} 

In jedem Fall werden Ihre Filter in einer Kette aufgerufen. Wenn Sie Ihren Filter teilen möchten, sollten Sie if Anweisung in Filtern, um nur benötigt, URL-Filter (Sie URL von 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

Hmmmm. Dank bekommen. Ich werde es versuchen und lassen Sie wissen, wenn Ich habe es geschafft. – Lazaruss

+0

Ok. Diese Lösung funktioniert für mich. Nochmals vielen Dank :) – Lazaruss

Verwandte Themen