2010-06-16 11 views
12

J'utilise Rack pour essayer d'implémenter la fonctionnalité "Remember Me" dans mon application Sinatra.Définir l'expiration du cookie de session de Rack par programme

Je suis en mesure de mettre le cookie de session à expiration lorsque la session se termine ou dans X secondes, mais je voudrais faire les deux. Par exemple, si un utilisateur a cliqué sur «se souvenir de moi», je souhaite que sa session se termine après X secondes. Par exemple, mon app.rb a une ligne qui ressemble à ceci:

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

J'ai essayé de faire ce qui suit lorsque l'utilisateur se connecte à:

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

Toutefois, cela ne définit pas le cookie valeur.

Est-ce que quelqu'un sait comment régler ceci?

Merci d'avance.

Répondre

4

Je tentais de faire exactement la même chose et je compris ce que le problème pour moi. Le cookie de session est défini sur chaque requête si vous avez défini un délai expire_after. Donc, quand vous dites if (! Remember_me), pour cette requête, l'heure d'expiration du cookie devient nulle. Toutefois, à la demande suivante, le cookie de session est réinitialisée avec un temps fin de 2592000. Il semble que le correctif est ne pas définir un temps de expire_after par défaut et dire à la place:

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


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

Je n'ai malheureusement pas compris comment avoir un délai expire_after par défaut et d'étendre ce temps de façon permanente par programmation.

0

Cela doit probablement être fait avant le chargement de la session.

Voir rack :: Session Cookie # load_session et de rack :: Session Cookie # commit_session de

0

La réponse de Chris n'a pas fonctionné pour moi. Je trouve que je devais assurer que j'ai inclus 'options de la session d'origine avec la nouvelle valeur de « expire_after », donc au lieu de:

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

J'utilise:

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

et assurez-vous pour mettre l'instruction use Rack::Session::Cookie (sans un paramètre expire_after) dans votre bloc configure, si vous utilisez Sinatra.

Cela a fait l'affaire.

+0

N'oubliez pas que si vous définissez/supprimez ensuite quelque chose dans le hachage de session, le cookie reviendra à la date d'expiration par défaut (c'est-à-dire un cookie de session). Pour le faire persister à travers les changements suivants, vous aurez besoin de stocker un drapeau marquant le statut "se souvenir de moi" dans le hachage de la session elle-même. –