2011-02-17 18 views
40

Estoy confundido con los ajustes de configuración legado de la gema:Recordarme Sesiones y

# The time the user will be remembered without asking for credentials again. 
    config.remember_for = 2.weeks 

    # The time you want to timeout the user session without activity. After this 
    # time the user will be asked for credentials again. 
    config.timeout_in = 10.minutes 

Quiero tener un usuario seleccione la opción "Recordarme" casilla de verificación (es decir, no cerrar sesión), pero el el tiempo de espera predeterminado de la sesión es de 10 minutos. Después de 10 minutos, me pide que inicie sesión nuevamente aunque he hecho clic en "Recordarme". Si esto es cierto, el remember_for no tiene sentido. Obviamente me falta algo aquí.

+3

No creo que debas usar estas 2 configuraciones al mismo tiempo. – Rafal

Respuesta

16

El timeout_in cerrará automáticamente la sesión dentro de los 10 minutos de inactividad y no es compatible con la casilla remember_me. Puedes tener uno, pero no ambos.

+2

Ya no es válido, eche un vistazo al comentario de pat a continuación –

+1

remember_me no funciona, si el tiempo de espera está habilitado o deshabilitado. – indb

+1

En la versión de diseño más reciente, ambos módulos son compatibles, sin embargo, el recordatorio parece tener prioridad sobre el tiempo de funcionamiento. – aromero

27

Ryan tiene razón en que la gema predeterminada Devise no es compatible con las opciones: rememberable y: timeoutable. Sin embargo, como todo Ruby, si no te gusta la decisión que ha tomado otro codificador, especialmente cuando se aleja de la norma que la mayoría de los usuarios esperan, entonces simplemente puedes anularla.

Gracias a un (rechazado) pull request podemos anular este comportamiento añadiendo el siguiente código al principio del archivo de configuración Idear (/config/initializers/devise.rb):

module Devise 
    module Models 
    module Timeoutable 
     # Checks whether the user session has expired based on configured time. 
     def timedout?(last_access) 
     return false if remember_exists_and_not_expired? 
     last_access && last_access <= self.class.timeout_in.ago 
     end 

     private 

     def remember_exists_and_not_expired? 
     return false unless respond_to?(:remember_expired?) 
     remember_created_at && !remember_expired? 
     end 
    end 
    end 
end 

Esto hará ahora le permiten configurar ambas opciones y hacer que funcionen como era de esperar.

config.remember_for = 2.weeks 
config.timeout_in = 30.minutes 
+11

Estoy actualizando Devise en el proyecto para el que necesitaba este parche (escribí la solicitud de extracción mencionada), y resulta que el compromiso en cuestión es en Devise, aunque la solicitud de extracción fue rechazada. Entonces ambas configuraciones deberían funcionar juntas ahora. – pat

+0

esto no funciona. – indb

8

La información en las respuestas anteriores no está actualizada. He probado mi proyecto, que usa Rails 4 y Devise 3.5.1 y also checked devise code para estar seguro.

Ahora parece si Remember Me casilla de verificación se comprobó:

  • si yes, comprueba if remember_exists_and_not_expired, así que básicamente utiliza config.remember_for para la gestión de sesiones

  • si no, comprueba if last_access <= timeout_in.ago, utilizando config.timeout_in correspondientemente

+2

El 16 de diciembre de 2015, se quitaron los cheques correspondientes (https://github.com/plataformatec/devise/commit/c92996646aba2d25b2c3e235fe0c4f1a84b70d24#diff-389934f38297288517a36c5adfddcc8aL29). Entonces ... suena como "ver por ti mismo" es la estrategia más confiable ahora. –

+0

En enero de 2016, los controles relevantes vuelven a agregar: ### 3.5.5 - 2016-22-01 * correcciones de errores * Traer de vuelta remember_expired? implementación * Asegúrese de que los tiempos de espera no se activen si me recuerdan. –

Cuestiones relacionadas