Tutorial Spring Security Básico

Spring Security es un framework diseñado para manejar los mecanismos de seguridad de una aplicación, como: autenticación, autorización, protección, etc., este es un framework Java que puede ser utilizado tanto, en aplicaciones web, como en aplicaciones de escritorio estándar, dedicaremos el presente tutorial a la configuración básica de una aplicación web Spring MVC, en próximos tutoriales iremos viendo conceptos más avanzados.

Para seguir nuestro tutorial debes crear un proyecto Maven, para usar esta tecnología debemos agregar las siguientes dependencias al POM.

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${security.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${security.version}</version>
</dependency>

La configuración de nuestro proyecto la realizaremos completamente utilizando código Java, no requerimos ningún archivo XML, esto es posible a partir de la versión Spring Security 3.2.

Para inicializar el filtro de seguridad debemos extender la siguiente clase:

public class WebSecInitializer extends AbstractSecurityWebApplicationInitializer { }

El DelegatingFilterProxy es inicializado cuando se detecte esta clase, no requerimos hacer más.

Para inicializar el Servlet añadiremos la siguiente clase, ya la hemos explicado en tutoriales anteriores, más específicamente en: configurar Spring MVC desde Java.

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{WebSecConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebAppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

El método getRootConfigClasses() hace referencia a la clase WebSecConfig, en ella configuramos la seguridad de nuestra aplicación web Spring MVC, la misma se define de la siguiente manera:

@Configuration
@EnableWebSecurity
public class WebSecConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureAuth(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user").password("user").roles("USER").and()
                .withUser("admin").password("admin").roles("USER", "ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic();
    } 
}

Usando la anotación @EnableWebSeurity y extendiendo la clase WebSecurityConfigurerAdapter podemos rápidamente configurar y activar la seguridad.

Sobre-escribimos configure() para habilitar la protección de las URL, .anyRequest().authenticated() indica que todas las peticiones estarán protegidas, es decir requerimos autenticarnos para poder acceder a cualquier parte del sitio, httpBasic() activa la protección HTTP básica, normalmente el navegador muestra un cuadro donde se no pedirá introducir nombre de usuario y contraseña.

Por otra parte sobre-escribimos configureAuth() para definir el modo como se autentica a los usuarios, para este ejemplo usaremos usuarios almacenados en memoria, debemos agregar los usuarios, contraseñas y roles para cada uno, cuando alguien quera acceder a nuestro sitio web deberá usar alguno de estos usuarios.

Tutorial Seguridad básica HTTP con Spring Security

Seguridad con formulario

Otro tipo autenticación que podemos usar en Spring Security es utilizando formularios, podemos crear nuestro propio formulario, pero para empezar en este tutorial utilizaremos el que nos provee el Framework por defecto, más adelante aprenderemos a reemplazarlo y adaptarlo a nuestras necesidades.

Lo primero que haremos será redefinir el método configure() para que quede de la siguiente manera:

protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/home").hasRole("USER")
            .antMatchers("/ventas").hasRole("ADMIN")
            .and().formLogin()
            .and().logout();
}

El código se explica de este modo, csrf().disable() desactiva la protección contra ataques CSRF ya que de momento no la requerimos, más adelante hablaremos sobre ella, .antMatchers("...").hasRole("...") nos ayuda a definir cuales roles de usuario pueden acceder a una determinada URL, por ejemplo, a "/ventas" solo puede acceder un usuario con roles de ADMIN, seguido vemos: formLogin() y logout(), el primero activa el formulario de autenticación por defecto y el segundo habilita el cierre de sesión de usuario, por defecto se usa la URL "/logout".

Veamos lo que tenemos, al intentar acceder al sitio veremos:

Spring Security formularios de autenticación

Si usamos el nombre y la contraseña user podremos acceder a /home pero no a /ventas ya que este usuario no tiene el rol requerido.

Spring Security cierre de sesión

Al hacer clic en el enlace ventas se nos denegará el acceso, por lo que debemos salir usando logout he ingresar con el nombre de usuario y contraseña admin, este usuario si tiene el rol requerido por lo que podremos ir a la página de ventas, pruébalo.

De momento el tutorial termina aquí, más adelante veremos como integrar una base de datos de usuarios a la autenticación y profundizaremos en el uso de los formularios, crearemos uno propio y veremos algunos otros conceptos de seguridad más avanzados como la protección de las contraseñas mediante algoritmos hash, uso de HTTPS y otros.

Descargar proyecto: spring-security-basico.zip

Comentarios

  1. Estube horas buscando una solución a esto,´hoy en día todo es Spring Boot y esta configuración que tu haces es tan simple, muchísimas gracias, es un avance que ya no me autorice la entrada, lo único que me falta es componer un error al tratar de log in:

    Error: There is no PasswordEncoder mapped for the id.

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

tkinter Canvas

Histogramas OpenCV Python

Python Binance API