Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add http security filter in java config

I'm trying to add web security in spring but I don't want the filter to apply to certain things. How is that done in java?

And maybe there's a better way to do this because I created a custom filter but this is the only way I can think to instantiate it because of its dependencies.

Overall, what I want to do is this:

/resources/** SHOULD NOT go through the filter, /login (POST) SHOULD NOT go through the filter, everything else SHOULD go through the filter

Through various example I found through spring I was able to come up with this as for a start but it obviously doesn't work:

@Configuration @EnableWebSecurity @Import(MyAppConfig.class) public class MySecurityConfig extends WebSecurityConfigurerAdapter {     @Override     public void configure(WebSecurity webSecurity) throws Exception     {         webSecurity.ignoring().antMatchers("/resources/**");     }      @Override     public void configure(HttpSecurity httpSecurity) throws Exception     {         httpSecurity                 .authorizeRequests()                 .antMatchers("/resources/**").permitAll()                 .antMatchers("/login").permitAll();          httpSecurity.httpBasic();         httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);     }      @Bean     @Autowired     public TokenFilterSecurityInterceptor<TokenInfo> tokenInfoTokenFilterSecurityInterceptor(MyTokenUserInfoCache userInfoCache, ServerStatusService serverStatusService, HttpSecurity httpSecurity) throws Exception     {         TokenService<TokenInfo> tokenService = new TokenServiceImpl(userInfoCache);         TokenFilterSecurityInterceptor<TokenInfo> tokenFilter = new TokenFilterSecurityInterceptor<TokenInfo>(tokenService, serverStatusService, "RUN_ROLE");         httpSecurity.addFilter(tokenFilter);         return tokenFilter;     } } 
like image 293
jensengar Avatar asked Nov 11 '13 22:11

jensengar


People also ask

What is security filter in Java?

Overview. The purpose of the security filter is to enforce authorization policies for the web application. In other words, the security filter makes sure that users only access the resources for which they are authorized.

How do I enable HTTP security in Spring?

The first thing you need to do is add Spring Security to the classpath. The WebSecurityConfig class is annotated with @EnableWebSecurity to enable Spring Security's web security support and provide the Spring MVC integration.


1 Answers

Are you interested in all of Spring Security ignoring the URLs or do you only want that specific filter to ignore the request? If you want all of Spring Security to ignore the request it can be done using the following:

@Configuration @EnableWebSecurity @Import(MyAppConfig.class) public class MySecurityConfig extends WebSecurityConfigurerAdapter {     @Autowired     private MyTokenUserInfoCache userInfoCache;     @Autowired     private ServerStatusService serverStatusService;      @Override     public void configure(WebSecurity webSecurity) throws Exception     {         webSecurity             .ignoring()                 // All of Spring Security will ignore the requests                 .antMatchers("/resources/**")                 .antMatchers(HttpMethod.POST, "/login");     }      @Override     public void configure(HttpSecurity http) throws Exception {         http             .addFilter(tokenInfoTokenFilterSecurityInterceptor())             .authorizeRequests()                 // this will grant access to GET /login too do you really want that?                 .antMatchers("/login").permitAll()                 .and()             .httpBasic().and()             .sessionManagement()                 .sessionCreationPolicy(SessionCreationPolicy.STATELESS);     }      @Bean     public TokenFilterSecurityInterceptor<TokenInfo> tokenInfoTokenFilterSecurityInterceptor() throws Exception     {         TokenService<TokenInfo> tokenService = new TokenServiceImpl(userInfoCache);         return new TokenFilterSecurityInterceptor<TokenInfo>(tokenService, serverStatusService, "RUN_ROLE");     } } 

If you want to have only that specific Filter ignore particular requests you can do something like this:

@Configuration @EnableWebSecurity @Import(MyAppConfig.class) public class MySecurityConfig extends WebSecurityConfigurerAdapter {     @Autowired     private MyTokenUserInfoCache userInfoCache;     @Autowired     private ServerStatusService serverStatusService;      @Override     public void configure(WebSecurity webSecurity) throws Exception     {         webSecurity             .ignoring()                 // ... whatever is here is ignored by All of Spring Security     }      @Override     public void configure(HttpSecurity http) throws Exception {         http             .addFilter(tokenInfoTokenFilterSecurityInterceptor())             .authorizeRequests()                 // this will grant access to GET /login too do you really want that?                 .antMatchers("/login").permitAll()                 .and()             .httpBasic().and()             .sessionManagement()                 .sessionCreationPolicy(SessionCreationPolicy.STATELESS);     }      @Bean     public TokenFilterSecurityInterceptor<TokenInfo> tokenInfoTokenFilterSecurityInterceptor() throws Exception     {         TokenService<TokenInfo> tokenService = new TokenServiceImpl(userInfoCache);         TokenFilterSecurityInterceptor tokenFilter new TokenFilterSecurityInterceptor<TokenInfo>(tokenService, serverStatusService, "RUN_ROLE");           RequestMatcher resourcesMatcher = new AntPathRequestMatcher("/resources/**");         RequestMatcher posLoginMatcher = new AntPathRequestMatcher("/login", "POST");         RequestMatcher ignored = new OrRequestMatcher(resourcesMatcher, postLoginMatcher);         return new DelegateRequestMatchingFilter(ignored, tokenService);     } }   public class DelegateRequestMatchingFilter implements Filter {     private Filter delegate;     private RequestMatcher ignoredRequests;      public DelegateRequestMatchingFilter(RequestMatcher matcher, Filter delegate) {         this.ignoredRequests = matcher;         this.delegate = delegate;     }      public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {          HttpServletRequest request = (HttpServletRequest) req;          if(ignoredRequests.matches(request)) {              chain.doFilter(req,resp,chain);          } else {              delegate.doFilter(req,resp,chain);          }     } } 
like image 149
Rob Winch Avatar answered Sep 28 '22 01:09

Rob Winch