2012-02-13 5 views
8

Por razones de seguridad establezco SESSION_EXPIRE_AT_BROWSER_CLOSE en verdadero.¿Existe alguna forma de combinar el comportamiento de SESSION_EXPIRE_AT_BROWSER_CLOSE y SESSION_COOKIE_AGE

Pero, las cookies de longitud del navegador (cookies que caducan tan pronto como el usuario cierra su navegador) no tienen un tiempo de caducidad, entonces SESSION_COOKIE_AGE no tiene efectos (Sí, lo compruebo). Pero quiero establecer un cierre de sesión/tiempo de espera en inactividad más para cerrar sesión en el cierre de exploración.

Mi pregunta es: ¿Cuál es la mejor manera de implementar el tiempo de espera de inactividad/cierre de sesión en el escenario de cookies de longitud del navegador?

Respuesta

16

Como explica, SESSION_EXPIRE_AT_BROWSER_CLOSE y SESSION_COOKIE_AGE no son compatibles. Cuando establece una fecha de caducidad para una cookie, esta se convierte en una cookie sin longitud de navegador.

Luego, para lograr el comportamiento deseado, debe establecer SESSION_EXPIRE_AT_BROWSER_CLOSE como True y el control caducar el tiempo de espera a mano.

Una forma elegante de controlar manualmente expira el tiempo de espera es:

  1. Crear un nuevo custom middleware que controlan el tiempo de espera.
  2. Modifique settings.py para habilitar su middleware personalizado (y sesiones).

El tiempo de espera personalizado middleware lata parece:

class timeOutMiddleware(object): 

    def process_request(self, request): 
     if request.user.is_authenticated(): 
      if 'lastRequest' in request.session:    
       elapsedTime = datetime.datetime.now() - \ 
           request.session['lastRequest'] 
       if elapsedTime.seconds > 15*60: 
        del request.session['lastRequest'] 
        logout(request) 

      request.session['lastRequest'] = datetime.datetime.now() 
     else: 
      if 'lastRequest' in request.session: 
       del request.session['lastRequest'] 

     return None 

Recuerde permitir sessions con el fin de almacenar lastRequest.

Esta solución está escrita y probada y ahora está trabajando en mi sitio. Este código tiene licencia GNU;)

Nuevo en Django 1.6 (... Dos años más tarde ...)

de fecha y hora y los valores timedelta sólo son serializable si está utilizando el PickleSerializer. Si no, quizás la solución fácil es translate datetime to unix timestamp and back. Sé libre de publicar debajo de esta traducción.

Edited

django-session-security aplicación proporciona un mecanismo para cerrar la sesión usuarios autenticados inactivos. Echar un vistazo.

+0

¡Como un encanto! ¡Gracias! – laffuste

+0

Que hace un maño en HK? – danihp

+0

Empece a viajar y no quise volver;) para como han dejado el país politicos y banqueros ... – laffuste

Cuestiones relacionadas