Recordar contraseña Spring Security

La opción de recordar la contraseña le permitirá al usuario de nuestra web mantener su sesión abierta hasta que la misma sea cerrada manualmente o expire el tiempo definido, por ejemplo, el usuario podrá cerrar el navegar y luego puede abrirlo nuevamente y visitar la web sin tener que ingresar el nombre de usuario y contraseña, la sesión se cerrara solo cuando el usuario lo indique explícitamente o luego de haber transcurrido el periodo de tiempo de inactividad establecido.

Recordar usuario usando una cookie

Este es el método mas fácil de implementar, el mismo utiliza una cookie para almacenar el nombre de usuario y la contraseña, esta cookie esta cifrada con el algoritmo MD5 para mantener la privacidad de los datos.

@Configuration
@EnableWebSecurity
public class WebSecConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetails;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    public void configureAuth(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(userDetails)
                .passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .antMatchers("/static/**").permitAll()
                    .anyRequest().authenticated()
                .and()
                    .formLogin()
                    .loginPage("/login")
                    .permitAll()
                .and()
                    .rememberMe()
                    .tokenValiditySeconds(36000)
                    .key("miclave")
                .and()
                    .logout().permitAll();
    }
}

Esta es la configuración de Spring Security, la mayoría del código lo hemos explicado en tutoriales previos, debemos saber que requerimos utilizar el proveedor de autenticación UserDetailsService y que la configuración para recordar la contraseña es esta:

.and()
    .rememberMe() // activar recordar usuario
    .tokenValiditySeconds(36000) // expira en 10 horas
    .key("miclave") // clave de cifrado

Para que todo sea funcional debemos agregar un checkbox al formulario de inicio de sesión, de este modo el usuario podrá decidir si deseo o no recordar su contraseña.

En la página login.jsp agregamos dicho código, lo único que debemos tener presente es que el nombre del control debe ser remember-me, este es el nombre por defecto, si lo deseamos podemos cambiarlo en la configuración usando rememberMeParameter("...") para indicar el nuevo nombre.

<div class="row">
    <input id="remember_me" name="remember-me" type="checkbox"/>
    <label for="remember_me" class="inline">Recordar contraseña</label>
</div>

Recordar contraseña Spring Security

Registramos un usuario y luego podremos iniciar sesión con él, podemos verificar la cookie en el navegador Chrome escribiendo la URL chrome://settings/cookies si eliminas remember-me no se recordara la contraseña, también puedes ver la fecha de expiración.

El nombre de la cookie se puede cambiar, en la clase de configuración usas el método rememberMeCookieName("...") para establecer el nuevo nombre de la misma.

Recordar contraseña usando una cookie

Recordar contraseña usando una cookie

Si todo está correcto puedes iniciar sesión, luego cerrar el navegador, si antes de que se agote el periodo de expiración (10 horas, para nosotros) vuelves a entrar a la web no deberás ingresar nuevamente tu nombre de usuario ni contraseña, si borraste la cookie si deberás hacerlo.

Usando los Spring Security Taglib podemos fácilmente saber si un usuario ha iniciado sesión a través del formulario respectivo o si se ha utilizado el mecanismo de recordar usuario, para ello utilizamos isRemememberMe() cuando deseamos mostrar un contenido a los usuarios que utilicen este mecanismo de autenticación.

<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/security/tags" %>

<!DOCTYPE html>
<html>
    <body>

        <s:authorize access="isRememberMe()" >
            <h3>Autenticado usando <em>RememberMe</em> cookie.</h3>
        </s:authorize>

    </body>
</html>

Es todo por ahora, espero les sirva de ayuda, aun hay cosas que mejorar en este proyecto, las veremos en próximamente.

Descargar proyecto: recordar-usuario-springsecurity.zip

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV

Conociendo la clase cv::Mat de OpenCV