Saltar al contenido

Cómo cerrar sesión automáticamente con Spring Security

Luego de consultar con expertos en este tema, programadores de deferentes áreas y maestros hemos dado con la solución al problema y la dejamos plasmada en esta publicación.

Solución:

¿Qué tal usar la configuración de seguridad? Espero que debajo de la configuración: funcione.

applicationContext.xml

 --namespace-> xmlns:security="http://www.springframework.org/schema/security"

        
        

web.xml

 
        
            30
        
    

Y ellos, debe escribir el suyo propio porque success-handler-ref = “Logout” es un controlador personalizado para el cierre de sesión:
Cerrar sesión
@Componente

public class Logout extends SimpleUrlLogoutSuccessHandler 

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws IOException, ServletException 

        if (authentication != null) 
            // do something 
        

        setDefaultTargetUrl("/login");
        super.onLogoutSuccess(request, response, authentication);       
    

Puede ser spring-security, spring-mvc o servlet, el cierre de sesión automático no es posible sin una lógica perfecta del lado del cliente.
Considerando que la aplicación tendrá ambos tipos de solicitud

  • AJAX y
  • envío de formulario / recarga de página

El cierre de sesión automático necesita una lógica muy calculada. Presentando mi implementación de la funcionalidad de autologout con lo siguiente

Ventajas.


1. No se utiliza ninguna llamada / solicitud adicional para lograr esto. teniendo en cuenta el impacto en el rendimiento si hay más de 10.000 usuarios activos y llamadas adicionales para lograr el cierre de sesión automático.
2. Configuración de una línea usando etiqueta.
3. Funciona perfectamente incluso si el usuario abre varias pestañas o varias ventanas.
4. Te informa antes de los 30 segundos de la invalidación de la sesión, por lo que si llenaste el formulario y no lo enviaste, puedes mantener la sesión viva (extender la sesión con un clic). Por lo tanto, es menos probable que el usuario pierda datos no guardados.

Uso


1. Incluya un script de cierre de sesión automático en las páginas JSP requeridas como se indica a continuación.

    ....
    
    

2. Cree una página JSP, autologout-script.jsp y agregue el siguiente código.
Nota: No se requiere editar / configurar

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


3. Configurar sesión attributes para configurar el tiempo de espera
Nota: Configure esto después de la creación de la sesión. Puede implementar el método sessionCreated de HttpSessionListener y establecer la siguiente configuración según sus requisitos.

session.setMaxInactiveInterval(300);

session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);

4. Agregue el siguiente html para mostrar el temporizador.

Nota: se puede mover a la página de plantilla de autologout-script si es bueno en CSS. Por lo tanto, puede evitar agregar esto en todas y cada una de las páginas.
Incluya bootstrap o agregue su CSS personalizado.


ingrese la descripción de la imagen aquí

Se trata de una implementación simple de cierre de sesión automático. Puede descargar un ejemplo de trabajo desde mi repositorio de github
Autologout usando un ejemplo de servlet simple
Autologout usando el ejemplo de configuración de java de spring-security
Autologout usando el ejemplo de configuración xml de spring-security

Explicación de la lógica


Caso 1: carga en la página

Aquí la lógica es simple, la carga de la página configura el temporizador del intervalo equlas a maxInactiveInterval. después del tiempo de espera se redirige a la página de inicio de sesión.
Caso 2: realizar un seguimiento de las llamadas AJAX

Ahora, considerando las solicitudes AJAX, puede usar devoluciones de llamada .ajaxStart () o .ajaxComplete () de jquery para que, si se activa alguna solicitud ajax, pueda restablecer el intervalo.
Caso 3: Seguimiento de la actividad de varias pestañas / ventanas

La comunicación Intertab se realiza para sincronizar el estado de cada pestaña. Se usó localStorage en el evento de cambio.

Limitaciones / mejoras necesarias

1. Si la sesión máxima permitida es una, si la sesión se toma de otro sistema, la solicitud AJAX fallará. Debe manejarse para redirigir a la página de inicio de sesión.
2. Utilice ajaxStart () en lugar de ajaxComplete () para tener una sincronización exacta de los valores de idleTime entre el servidor y el navegador.

Requisitos

1. Jquery

Comparación de alternativas a la implementación actual


1. Configuración del encabezado de actualización en respuesta http. (No funciona para solicitudes AJAX)

response.setHeader("Refresh", "60; URL=login.jsp");
  1. Configuración de metaetiqueta de actualización en HTML (No funciona para solicitudes AJAX)

  1. Configurar el verificador de actividad
    Mantiene la sesión activa mediante repetidas solicitudes AJAX. Realiza un seguimiento del tiempo de inactividad y realiza una solicitud de cierre de sesión después del tiempo de espera.
    Sin duda es una buena con lógica simple. Pero solo quiero entintar mis observaciones.

    • Impacto en el rendimiento si se realizan 2 solicitudes por minuto para mantener la sesión viva y 50k usuarios activos. 100 mil solicitudes por minuto.
    • Comunicación intertab Si hay dos pestañas abiertas, una pestaña está recibiendo actividad pero la otra pestaña no está recibiendo actividad, esa pestaña activa la solicitud de cierre de sesión e invalida la sesión aunque haya actividad en la otra pestaña. (Pero se puede manejar)
    • Forzar enfoque de cierre de sesión Es un cliente que se domina sobre el servidor para invalidar la sesión.

Comentarios y valoraciones

Si conservas alguna vacilación o capacidad de progresar nuestro ensayo eres capaz de realizar una referencia y con placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *