Spring Security with Spring Boot 2.0: Securing your endpoints
Up until now in our previous posts we had our endpoints and controllers secured using the default spring security configuration.
When Spring Security is on the classpath, the auto-configuration secures all endpoints by default.
When it comes to complex applications we need different security policies per endpoints. We need to configure which endpoints should be secured, what type of users should be able to access the endpoints and endpoints that should be public.
A great example would be an endpoint which will displays a welcome message to the user.
package com.gkatzioura.security.securityendpoints.controller; import java.util.ArrayList; import java.util.List; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class IndexController { @GetMapping(path = "welcome") public String getMessage() { return "Welcome to the application"; } }
Regarding the fact that your application is already secured you need to provide public access to that endpoint.
In order to do so, spring provides us with the HttpSecurity class. By extending the WebSecurityConfigurerAdapter
we can configure the endpoints which should be secured and the endpoint which should be public.
So let’s create the WebSecurityConfigurerAdapter
configuration.
package com.gkatzioura.security.securityendpoints.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/welcome").permitAll() .anyRequest().authenticated() .and() .formLogin() .permitAll() .and() .logout() .permitAll(); } }
So let’s take it to parts by calling the authorizeRequests
function. We get an http configurer and it’s possible to add the endpoints that we want public or secure.
By calling the function antMatchers
we can pass an array of ant patterns. The function applied would create a rule for each endpoint specified in the antmatchers.
The next function is the anyRequest
. The authenticated rule will be apply to any request received.
Last but not least spring comes with the default login form and the default logout endpoint. In order to make it feasible to login and logout we must allow access to these endpoints.
So the end result would be to have the welcome endpoint publicly accessible, a preconfigured form for login and the logout endpoint.
Published on Java Code Geeks with permission by Emmanouil Gkatziouras, partner at our JCG program. See the original article here: Spring Security with Spring Boot 2.0: Securing your endpoints Opinions expressed by Java Code Geeks contributors are their own. |