:::: MENU ::::

Spring Security

Estructura básica con Spring Boot

Usaremos Spring Boot para generar rápidamente un proyecto Java con Spring Security. Vamos a https://start.spring.io/ y seleccionamos las dependencias Web, Thymeleaf y Security. Pulsando en “Switch to the full version” podemos establecer los valores para el grupo, artefacto y demás campos. Pulsamos en “Generate Project”, descomprimimos el fichero descargado y lo importamos en Eclipse con “Import as Maven Project”. Esperamos a que se descarguen las dependencias y ya tendremos la estructura base.

Plantillas

Vamos a generar plantillas Thymeleaf para mostrar el contenido de nuestra aplicación Web. Necesitamos tres ficheros: 1. Un index donde como página principal. 2. Una página de login que permitirá a los usuarios autenticarse. 3. Una página protegida. Situamos estos ficheros en la ruta src/main/resources/templates.

index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:th="http://www.thymeleaf.org"
	xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Demo Index page</title>
</head>
<body>
	<a th:href="@{/protected}">Go to protected page</a>
</body>
</html>

login.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:th="http://www.thymeleaf.org"
	xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Demo Login page</title>
</head>
<body>
	<div th:if="${param.error}">Invalid username and password.</div>
	<div th:if="${param.logout}">You have been logged out.</div>
	<form th:action="@{/login}" method="post">
		<div>
			<label> User Name : <input type="text" name="username" />
			</label>
		</div>
		<div>
			<label> Password: <input type="password" name="password" />
			</label>
		</div>
		<div>
			<input type="submit" value="Sign In" />
		</div>
	</form>
</body>
</html>

protected.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:th="http://www.thymeleaf.org"
	xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Demo Protected page</title>
</head>
<body>
	<h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!</h1>
	<form th:action="@{/logout}" method="post">
		<input type="submit" value="Sign Out" />
	</form>
</body>
</html>

Configuración

Ahora tenemos que decirle al ViewResolver de Thymeleaf qué URLs están asociadas a qué páginas, para que sepa redireccionar al usuario. Desde la versión 3.2 se pueden usar anotaciones que evitan la necesidad de usar XML para configurar Spring Security. Creamos el siguiente fichero:

package com.luisgomezcaballero.springsecuritydemo;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

	@Override
	public void addViewControllers(ViewControllerRegistry registry) {

		registry.addViewController("/index").setViewName("index");
		registry.addViewController("/").setViewName("index");
		registry.addViewController("/protected").setViewName("protected");
		registry.addViewController("/login").setViewName("login");

	}

}

Después, tenemos que configurar la seguridad de las peticiones especificando qué recursos estarán protegidos y cuáles no. Para este caso hemos creado un usuario en memoria con su contraseña y un rol.

package com.luisgomezcaballero.springsecuritydemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {

		http.authorizeRequests().antMatchers("/", "/index").permitAll().anyRequest().authenticated().and().formLogin()
				.loginPage("/login").permitAll().and().logout().permitAll();

	}

	@Autowired
	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

		auth.inMemoryAuthentication().withUser("admin").password("password").roles("ADMIN");

	}
}

Demostración

Clic derecho en SpringSecurityDemoApplication y Run As Java Application. En la pestaña de Consola podemos ver cómo se inicia el Tomcat embebido. Una vez terminado, vamos a http://localhost:/8080. Pulsamos en el enlace y, como es un recurso protegido, nos pedirá usuario y contraseña. Si no introducimos la correcta se mostrará un mensaje de error. Si accedemos correctamente podremos ver el contenido de la página protegida.

Repositorio

Este proyecto de demostración puede encontrarse en https://github.com/luisgomezcaballero/spring-security-demo.


So, what do you think ?