Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'ai lu pas mal de contributions ici et ailleurs mais souvent ça vole trop haut pour moi à cause de la gestion de la sécurité que je ne maitrise pas encore bien et vu le nombre de "recettes" possibles.
Donc, dans un premier temps je souhaite que ça fonctionne tout simplement, je me poserais les questions de sécurité après...
Ce préambule étant fait, voici ma question :
Si un utilisateur se connecte en cochant la case 'Se souvenir de moi...' alors je fais un Zend_Session::rememberMe(604800) pour conserver l'identification valide dans un cookie pendant une semaine.
Le problème est que la documentation du ZF indique que Zend_Session::rememberMe doit être appelé AVANT Zend_Session::start(), et mon Zend_Session::start() est en début de mon bootstrap, donc avant la connexion et le Zend_Session::rememberMe(604800)...
Comment utiliser Zend_Session::rememberMe(604800) malgré tout ?
Dois-je déplacer le Zend_Session::start() ?
Merci par avance pour votre aide.
Hors ligne
Est-ce que tu as regardé si la méthode "setExpirationSeconds" n'influence pas sur le "rememberMe" ?
Car de mémoire ceci est possible :
<?php $namespace = new Zend_Session_Namespace('My_Auth'); $namespace->setExpirationSeconds(6000);
Ce qui te permettrait de configurer l'expiration des données lors du login.
Dernière modification par acharrex (10-01-2009 17:03:01)
Hors ligne
Il semble que setExpirationSeconds, d'après la documentation, ne reste pas à la fermeture du navigateur.
Contrairement à rememberMe, mais avec le problème auquel je fais allusion dans ma question.
Hors ligne
Ca me paraît vraiment bizarre tout ça. Normalement le "rememberMe" serait égal au "setExpirationSeconds" le plus élevé (enfin ça me paraît logique).
M'enfin, tu as regardé si tu pouvais utiliser Zend_Session::setOptions() d'une fois que la session est démarrée afin de modifier la valeur du "rememberMe" ?
Hors ligne
Voilà un extrait de la doc officielle :
44.4.4. rememberMe(integer $seconds)
Par défaut, la session se termine lorsque le client ferme son navigateur. Il peut cependant être nécessaire de faire en sorte que même après la fermeture, le cookie de session persiste un certain temps dans le navigateur. Utilisez Zend_Session::rememberMe() avant tout démarrage de la session, afin de spécifier à celle-ci qu'elle devra utiliser un cookie persistant du coté du client. Ce cookie persistera alors $seconds secondes. Si vous ne précisez pas de temps, remember_me_seconds, sera utilisé. Cette valeur se paramètre d'ailleurs au moyen de Zend_Session::setOptions().
Il semble que ce soit la seule possibilité. Sauf bien entendu à gérer soi même les cookies. Mais justement, l'intérêt du ZF c'est de pouvoir se décharger de se genre de truc...
Et en effet, ça marche, mais partiellement. Si je ferme totalement le navigateur, et que je le réouvre, alors je suis toujours connecté. Et ça c'est bien.
Mais si je fais ça le lendemain, plus de connexion, alors que j'ai 604800 dans mon rememberMe, soit une semaine, et ça, ce n'est pas bien du tout.
Bref, la doc est claire : le rememberMe avant tout démarrage de session.
J'avais pensé à faire un destroy de la session si l'utilisateur demande à se connecter pour faire un rememberMe juste avant la procédure de connexion et donc de création de session... Mais si quelqu'un a une solution moins "bourrin" je suis preneur.
Hors ligne
Bonjour,
Pour cette problématique, au moment de l'authentification, si l'utilisateur coche remember me, je met en place un cookie $_COOKIE["Mmx_Auth_RememberMe"].
Puis, dans mon bootstrap, si ce cookie est présent j'appelle Zend_Session::rememberMe() et détruit le cookie.
Extraie de mon bootstrap :
// Session require 'Zend/Session.php'; // User checked remember me on authetification if (isset($_COOKIE["Mmx_Auth_RememberMe"])) { Zend_Session::rememberMe($appConfig->sessions->rememberMe); unset($_COOKIE["Mmx_Auth_RememberMe"]); } // set options with multi domain cookie @see : http://www.z-f.fr/forum/viewtopic.php?id=502 // activate session garbage collector disabled by default on Debian gc_probability, gc_divisor @see http://oscarm.org/news/detail/666-debian_php5_and_session_garbage_collection // @see http://www.nabble.com/Zend_Session::rememberMe()-td19975066.html $sessionOptions = array( 'cookie_path' => '/' , 'cookie_domain' => '.' . $appConfig->url->domain , 'save_path' => self::$_rootPath . '/' . $appConfig->sessions->savePath , 'gc_probability' => 1 , 'gc_divisor' => 100 , 'gc_maxlifetime' => $appConfig->sessions->gc_maxlifetime); Zend_Session::setOptions($sessionOptions); Zend_Session::start();
Hors ligne
Ok je comprends, ce qui te permet de coller un rememberMe avant Zend_Session::start().
Bon j'espérais qu'il y ait quelque chose de plus direct mais c'est nickel.
Merci !
Hors ligne
Oui, moi aussi je pensai qu'il existait un moyen plus directe et après un post sur la mailing-list il en ressort que non :
http://www.nabble.com/Zend_Session%3A%3Astart()-and-remember-me-td14189207.html
Hors ligne
Je reviens sur cette discussion, car je me rends compte qu'en utilisant la technique de 2mx, j'ai un nouvel identifiant de session qui est généré pour un même utilisateur à chaque passage dans le bootstrap...
Bon je n'ai peut être pas tout suivi, mais je ne parviens pas à trouver quelque chose de vraiment clair et fiable.
J'ai lu sur le forum que MrMoOx disait qu'il suffisait d'utiliser Zend_Session::rememberMe(tempsensecondes).
Mais dans la doc du ZF il est dit que ce doit être avant Zend_Session::start()...
Et même si google me ramène plusieurs exemples, un certain nombre restent contradictoires...
Donc si quelqu'un connait l'existence d'un exemple sans ambiguïté, je suis preneur...
Hors ligne
Le changement de l'ID de session est normal... le rememberme appelle automatiquement regenerateid()...
Donc normal...
Mais bon ça fait beaucoup de trafic ça non ?
Hors ligne
SaLuT les ZenDer'S,
j'arrive un peu tard pour répondre à ce post mais si ça peux en aider d'autre... :p
Pour ma part j'ai fais :
$username = $form->getValue('username'); $password = $form->getValue('password'); if (authentication($username,$password )) { $rememberMe = $form->getValue('rememberme'); $seconds = 60 * 60 * 24 * 7; // 7 days if ($rememberMe) { Zend_Session::RememberMe($seconds); } else { Zend_Session::ForgetMe(); } $this->_helper->Redirector->gotoSimple('index','index','backo'); }
Hors ligne