2010-06-16 11 views
12

Estoy usando Rack para intentar implementar la funcionalidad "Recordarme" en mi aplicación Sinatra.Establecer la caducidad de la cookie de la sesión de Rack programáticamente

Puedo configurar la cookie de sesión para que caduque cuando finaliza la sesión o en X segundos, pero me gustaría hacer ambas cosas.

Por ejemplo, si un usuario ha hecho clic en "recordarme", entonces deseo que su sesión termine después de X segundos. Por ejemplo, mi app.rb tiene una línea que tiene este aspecto:

use Rack::Session::Cookie, :expire_after => 2592000, #30 days in seconds 
          :secret => MY_SECRET 

Yo he tratado de hacer lo siguiente cuando el usuario inicia sesión en:

if (!remember_me) 
    env['rack.session.options'][:expire_after] = nil 
end 

Sin embargo, este no establece la cookie valor.

¿Alguien sabe cómo configurar esto?

Gracias de antemano.

Respuesta

4

yo estaba tratando de hacer exactamente lo mismo y me di cuenta de cuál es el problema para mí era. La cookie de sesión se configura en cada solicitud si tiene una expire_after time establecida. Entonces, cuando dices si (! Remember_me), para esa solicitud el tiempo de caducidad de la cookie se establece en cero. Sin embargo, en la siguiente petición, la cookie de sesión se reinicia con un tiempo de expirar 2592000. Parece que la solución es no establecer un tiempo predeterminado expire_after y en lugar de decir:

# don't set default expire time 
use Rack::Session::Cookie, :secret => MY_SECRET 


if(remember_me) 
    env['rack.session.options'][:expire_after] = 2592000 
end 

he lamentablemente no descubierto la manera tener un vencimiento predeterminado por tiempo y prolongar permanentemente ese tiempo programáticamente.

0

Esto probablemente tiene que hacerse antes de que se cargue la sesión.

Ver rack :: :: Sesión Cookies # load_session y rack :: :: Sesión Cookies # commit_session

0

La respuesta de Chris no funcionó para mí. Me di cuenta que tenía que asegurarse de que he incluido 'opciones' la sesión original con el nuevo valor 'expire_after', así que en vez de:

env['rack.session.options'][:expire_after] = 2592000 

yo usaría:

env['rack.session.options'].merge! expire_after: 2592000 

y sea seguro para poner la instrucción use Rack::Session::Cookie (sin una configuración expire_after) en el bloque configure, si está utilizando Sinatra.

Esto hizo el truco.

+0

No olvide que si posteriormente configura/elimina algo en el hash de la sesión, la cookie volverá a la fecha de caducidad predeterminada (es decir, una cookie de sesión). Para que persista a través de los cambios posteriores, deberá almacenar un indicador que marque el estado "Recordarme" también dentro del hash de la sesión. –

Cuestiones relacionadas