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; } }
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.
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.
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); } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With