Nuestra aplicación Django tiene los siguientes requisitos de gestión de sesiones.
- Las sesiones caducan cuando el usuario cierra el navegador.
- Las sesiones caducan después de un período de inactividad.
- Detecta cuándo caduca una sesión debido a la inactividad y muestra el mensaje correspondiente al usuario.
- Advierta a los usuarios sobre el vencimiento de una sesión inminente unos minutos antes del final del período de inactividad. Junto con la advertencia, brinde a los usuarios una opción para extender su sesión.
- Si el usuario está trabajando en una actividad comercial prolongada dentro de la aplicación que no implica el envío de solicitudes al servidor, la sesión no debe expirar.
Después de leer la documentación, el código Django y algunas publicaciones de blog relacionadas con esto, se me ocurrió el siguiente enfoque de implementación.
Requisito 1
Este requisito se implementa fácilmente estableciendo SESSION_EXPIRE_AT_BROWSER_CLOSE en True.
Requisito 2
He visto algunas recomendaciones para usar SESSION_COOKIE_AGE para establecer el período de caducidad de la sesión. Pero este método tiene los siguientes problemas.
La sesión siempre expira al final de SESSION_COOKIE_AGE incluso si el usuario está usando la aplicación de forma activa. (Esto se puede evitar configurando el vencimiento de la sesión en SESSION_COOKIE_AGE en cada solicitud usando un middleware personalizado o guardando la sesión en cada solicitud configurando SESSION_SAVE_EVERY_REQUEST en verdadero. Pero el siguiente problema es inevitable debido al uso de SESSION_COOKIE_AGE).
Debido a la forma en que funcionan las cookies, SESSION_EXPIRE_AT_BROWSER_CLOSE y SESSION_COOKIE_AGE son mutuamente excluyentes, es decir, la cookie caduca al cerrar el navegador o en el tiempo de caducidad especificado. Si se utiliza SESSION_COOKIE_AGE y el usuario cierra el navegador antes de que caduque la cookie, la cookie se retiene y la reapertura del navegador permitirá que el usuario (o cualquier otra persona) ingrese al sistema sin volver a autenticarse.
Django se basa solo en la presencia de la cookie para determinar si la sesión está activa. No verifica la fecha de vencimiento de la sesión almacenada con la sesión.
El siguiente método podría utilizarse para implementar este requisito y solucionar los problemas mencionados anteriormente.
- No establezca SESSION_COOKIE_AGE.
- Establezca la fecha de vencimiento de la sesión en 'tiempo actual + período de inactividad' en cada solicitud.
- Anule process_request en SessionMiddleware y compruebe la expiración de la sesión. Descarte la sesión si ha expirado.
Requisito 3
Cuando detectamos que la sesión ha expirado (en el SessionMiddleware personalizado anterior), establezca un atributo en la solicitud para indicar la expiración de la sesión. Este atributo se puede utilizar para mostrar un mensaje apropiado al usuario.
Requisito 4
Utilice JavaScript para detectar la inactividad del usuario, proporcionar la advertencia y también una opción para extender la sesión. Si el usuario desea extender la sesión, envíe un pulso de mantener vivo al servidor para extender la sesión.
Requisito 5
Utilice JavaScript para detectar la actividad del usuario (durante la operación comercial prolongada) y envíe impulsos de mantener vivo al servidor para evitar que la sesión expire.
El enfoque de implementación anterior parece muy elaborado y me preguntaba si podría haber un método más simple (especialmente para el Requisito 2).
Cualquier información será muy apreciada.