Just about anybody can appreciate the value of securing a web application. After all, who would do their online banking on an unsecured website? Of course, it’s not just online banking that requires security. Just about any website that has information that requires protecting needs security.

Spring provides web security modules that help us secure our applications. As with everything in Spring, it’s really easy to use an configure.

Define a Security Class

Spring has us extend the WebSecurityConfigurerAdapter class and annotate it with @Configuration and @EnableWebSecurity. Here is an example Kotlin class that enables our web security and forces all requests to the web application to be authenticated.

@Configuration //Make this as a configuration class @EnableWebSecurity //Turn on Web Security class SecurityWebInitializer : WebSecurityConfigurerAdapter(){ override fun configure(http: HttpSecurity) { //This tells Spring Security to authorize all requests //We use formLogin and httpBasic http .authorizeRequests() .anyRequest() .authenticated() .and() .formLogin() .and() .httpBasic() } override fun configure(auth: AuthenticationManagerBuilder) { //This code sets up a user store in memory. This is //useful for debugging and development auth .inMemoryAuthentication() .withUser("bob") .password("belcher") .roles("USER") .and() .withUser("admin") .password("admin") .roles("USER", "ADMIN") } }

The first method, configure(http: HttpSecurity) calls methods on the http object. This class has a chaining interface and by calling the proper methods, we can tailor the security configuration to suit our needs. The methods are plain english, so the code ends up being highly self-documenting.

The other configure method accepts an auth: AuthenticationManagerBuild . The auth object is used to configure a data store for users. For the purposes of this post, we are creating an inMemoryAuthentication. This is useful for development and debugging purposes.

The Controller Class

There isn’t anything special about the controller class. That’s a feature of Spring Security. Security is a cross cutting concern which means that the main application code should not have to concern itself with security. Instead, Spring uses Aspect Orientated programming to secure our application.

Sometimes it’s useful to know what user is logged into this system. There is a an example of how to access this information and pass it back to the view. (Readers who are not familiar with Spring MVC can refer here for an example of Spring MVC).

@Controller @RequestMapping("/") class IndexController { @RequestMapping(method = arrayOf(RequestMethod.GET)) fun doGet(model : Model) : String { //We can access the current user like this val authorization = SecurityContextHolder.getContext().authentication //Send the user name back to the view model.addAttribute("username", authorization.name) return "index" } }

The SecurityContextHolder class provides an access point to the current logged in user. Spring calls it an authentication. The object returns contains information about the user such as the user name.

Conclusion

Here is a video of logging into this site in action.



You can get the code from my github page here.