Nuestra aplicación Django tiene los siguientes requisitos de gestión de sesión.¿Cómo caducar la sesión debido a inactividad en Django?
- Las sesiones caducan cuando el usuario cierra el navegador.
- Las sesiones caducan después de un período de inactividad.
- Detecta cuando una sesión caduca debido a inactividad y muestra el mensaje apropiado al usuario.
- Advierta a los usuarios de una vencimiento inminente de la sesión unos minutos antes del final del período de inactividad. Junto con la advertencia, brinde a los usuarios la opción de extender su sesión.
- Si el usuario está trabajando en una actividad comercial larga dentro de la aplicación que no implica solicitudes que se envían al servidor, la sesión no debe exceder el tiempo de espera.
Después de leer la documentación, el código de Django y algunas publicaciones de blog relacionadas con esto, he presentado el siguiente enfoque de implementación.
Requisito 1
Este requisito se implementa fácilmente mediante el establecimiento de SESSION_EXPIRE_AT_BROWSER_CLOSE en True.
Requisito 2
he visto algunas recomendaciones para utilizar SESSION_COOKIE_AGE para establecer el periodo de caducidad de sesión. Pero este método tiene los siguientes problemas.
La sesión siempre expira al final de la SESSION_COOKIE_AGE incluso si el usuario está utilizando activamente la aplicación. (Esto puede evitarse configurando el vencimiento de la sesión en SESSION_COOKIE_AGE en cada solicitud utilizando 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 usa SESSION_COOKIE_AGE y el usuario cierra el navegador antes de que caduque, la cookie se conserva y la reapertura del navegador permitirá al usuario (o a cualquier otra persona) ingresar al sistema sin volver a autenticarse.
Django se basa solo en la cookie presente para determinar si la sesión está activa. No verifica la fecha de caducidad 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 caducidad de la sesión como 'hora actual + período de inactividad' en cada solicitud.
- Anula process_request en SessionMiddleware y comprueba la caducidad de la sesión. Deseche la sesión si ha expirado.
Requisito 3
cuando detectamos que la sesión ha expirado (en el SessionMiddleware personalizado a continuación), establecer un atributo de la solicitud para indicar la sesión de caducidad. Este atributo se puede usar para mostrar un mensaje apropiado al usuario.
Requisito 4
Uso de JavaScript para detectar inactividad del usuario, proporcionan la advertencia y también una opción para extender el período de sesiones. Si el usuario desea extender, envíe un pulso de mantener vivo al servidor para extender la sesión.
Requisito 5
Uso de JavaScript para detectar la actividad del usuario (durante la operación de negocio de largo) y enviar pulsos a mantener con vida al servidor para prevenir la sesión a expirar.
El enfoque de implementación anterior parece muy elaborado y me preguntaba si habría un método más simple (especialmente para Requisito 2).
Cualquier idea será muy apreciada.
1 para proporcionar una solución detallada – Don
"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 o bien expira el navegador cerca o en el momento de vencimiento determinado. Si se utiliza SESSION_COOKIE_AGE y el usuario cierra el navegador antes de que la cookie expire, la cookie se retiene y la reapertura del navegador permitirá al usuario (o a cualquier otra persona) ingresar al sistema sin volver a autenticarse ". Corrígeme si estoy equivocado, ¿pero esto ya no parece ser cierto en las versiones más nuevas de Django? (1.5+ al menos) –
Hay un middleware que puede hacer lo que necesita. [en github] (https://github.com/subhranath/django-session-idle-timeout) y [en pypi] (http://pypi.python.org/pypi/django-session-idle-timeout/1.3 .1) – gbutler