Cierre de sesión manual con Spring Security

1. Introducción

Spring Security es el estándar para proteger las aplicaciones basadas en Spring. Tiene varias funciones para administrar la autenticación del usuario, incluido el inicio y cierre de sesión.

En este tutorial, nos centraremos en el cierre de sesión manual con Spring Security.

Asumiremos que los lectores ya comprenden el proceso estándar de cierre de sesión de Spring Security.

2. Cierre de sesión básico

Cuando un usuario intenta cerrar la sesión, tiene varias consecuencias en su estado de sesión actual . Necesitamos destruir la sesión con dos pasos:

  1. Invalidar la información de la sesión HTTP.
  2. Borre SecurityContext, ya que contiene información de autenticación.

Estas dos acciones las realiza SecurityContextLogoutHandler.

Veamos eso en acción:

@Configuration public class DefaultLogoutConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .logout(logout -> logout .logoutUrl("/basic/basiclogout") .addLogoutHandler(new SecurityContextLogoutHandler()) ); } }

Tenga en cuenta que SecurityContextLogoutHandler se añade por la primavera de Seguridad por defecto - sólo mostramos aquí para mayor claridad.

3. Cierre de sesión de eliminación de cookies

A menudo, un cierre de sesión también requiere que eliminemos algunas o todas las cookies de un usuario.

Podemos crear nuestro propio LogoutHandler que recorre todas las cookies y las expira al cerrar la sesión:

@Configuration public class AllCookieClearingLogoutConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .logout(logout -> logout .logoutUrl("/cookies/cookielogout") .addLogoutHandler((request, response, auth) -> { for (Cookie cookie : request.getCookies()) { String cookieName = cookie.getName(); Cookie cookieToDelete = new Cookie(cookieName, null); cookieToDelete.setMaxAge(0); response.addCookie(cookieToDelete); } }) ); } }

Por otro lado, Spring Security proporciona CookieClearingLogoutHandler, que es un controlador de cierre de sesión listo para usar para la eliminación de cookies.

4. Cierre de sesión del encabezado Clear-Site-Data

Alternativamente, podemos usar un encabezado de respuesta HTTP especial para lograr lo mismo; aquí es donde entra en juego el encabezado Clear-Site-Data . El encabezado Clear-Data-Site borra los datos de navegación (cookies, almacenamiento, caché) asociados con el sitio web solicitante:

@Configuration public class ClearSiteDataHeaderLogoutConfiguration extends WebSecurityConfigurerAdapter { private static final ClearSiteDataHeaderWriter.Directive[] SOURCE = {CACHE, COOKIES, STORAGE, EXECUTION_CONTEXTS}; @Override protected void configure(HttpSecurity http) throws Exception { http .logout(logout -> logout .logoutUrl("/csd/csdlogout") .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(SOURCE))) ); } }

Tenga en cuenta que la limpieza del almacenamiento puede dañar el estado de la aplicación cuando borramos solo un tipo de almacenamiento. Por lo tanto, debido a la compensación incompleta, el encabezado solo se aplica si la solicitud es segura.

5. Conclusión

Spring Security tiene muchas funciones integradas para manejar escenarios de autenticación. Siempre resulta útil dominar el uso de esas funciones mediante programación.

Como siempre, el código para estos ejemplos está disponible en GitHub.