IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

Problème de gestion des sessions


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut Problème de gestion des sessions
    Bonjours,

    J'ai actuellement un léger problème de gestion de session avec Zend (1).
    J'ai un application avec un controller qui permet de paramétrer des préférences utilisateurs.

    Voila comment je stock en session mes préférences utilisateur une fois le formulaire valider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*--- J'ai aussi essayer : new Zend_Session_Namespace('Zend_Auth', true) ---*/	
    $authNamespace = new Zend_Session_Namespace('Zend_Auth');
    /*--- $preferences  est un tableau contenant mes preferences utilisateur ---*/
    $authNamespace->preferences = $preferences ;
    Si je fait un var_dump() de ma session les préférences sont bien mise à jour.

    Ensuite dans les autres controllers je veux accéder à mes préférences stockée
    en session comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	$auth = Zend_Auth::getInstance();
    	if ($auth->hasIdentity()) {
    		$authNamespace = new Zend_Session_Namespace('Zend_Auth');
                   $authNamespace->preferences
    	}
    Seulement pour une raison qui m’échappe complètement préférences n'est pas à jour.
    Il ne contient pas les nouvelles valeurs mais celles valables lorsque l'utilisateur s'est loggé.

    Pour que les préférences soit mise à jour je dois me delogger et me relogger.
    C'est comme si à la validation de mon formulaire de paramétrage des préférences je passais sur une seconde session.
    Quelqu'un voie où j'ai merdoyé ?
    Merci d'avance pour vos pistes.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Bonsoir,

    Le namespace de session Zend_Auth est utilisé en interne par le Zend_Auth_Storage_Session (la classe de stockage des données authentifiées qui est utilisée par défaut par Zend_Auth), du coup l'utiliser pour des données de l'application c'est aussi prendre le risque de certains effets de bord, même si en regardant le code source du ZF j'ai du mal à voir d'où ça vient.

    A tout hasard, tu as essayé d'utiliser un namespace spécifique pour tes préférences, voir si le problème persiste ?

    Idéalement, je ne suis pas contre voir comment et à quel moment l'authenticate() est appelé, pour bien comprendre l'enchaînement de ton code.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut
    Bon j'ai pas mal retourné le problème.

    Voila en gros ce qui se passe lors de la connexion d'un utilisateurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    		//Dans LoginController.php
    		indexAction() {
     
                            //Si je comprends ma session débute Ici
    			$authNamespace = new Zend_Session_Namespace('Zend_Auth');
     
    			//Je passe les details
    			//J'affiche le formulaire
    			//Si isPost je test le Mdp
     
    			if ($authAuthenticate->isValid()) {
    				$storage = Zend_Auth::getInstance()->getStorage();
    				//Je commence à renseigner les données de ma session
    				$storage->write ( $authAdapter->getResultRowObject ( null, array('UTILISATEUR_password') ) );
     
    				$id_utilisateur = $authAdapter->getResultRowObject (null)->UTILISATEUR_id_utilisateur;
     
    				Utilisateurs::initParam($id_utilisateur) ;
     
    				/*Puis je redirige l'utilisateur vers sa page*/
     
    			}
    		}	
    		//Dans UtilisateurController.php		
    		static function initParam($id_utilisateur) {
     
                            //CECI donne les anciennes valeurs des préférences Utilisateurs 
                            var_dump($_SESSION['Zend_Auth']['storage']);
     
    			$utilisateur = new Utilisateurs();
    			$roles = $utilisateur->getRole($id_utilisateur);//On récupére les roles de l'utilsateur
    			$prefs = $utilisateur->getPreferences($id_utilisateur);//On récupére les preferences de l'utilsateur
     
    			//On recupére les info de session
    			$storage = Zend_Auth::getInstance()->getStorage();
    			$infos_session = $storage->read();
     
    			//On ajoute aux info utilisateur un tableau contenant les roles de cette utilisateur
    			$infos_session->{'UTILISATEUR_roles'} = null;
    			$infos_session->{'UTILISATEUR_roles'} = $roles;// Les roles sont gérer avec ACL
     
    			$preferences = array();
    			if(count($prefs)>0) {
    				foreach ($prefs as $pref) {
    					$preferences[$pref['PREFERENCE_libelle']] = $pref['PREFERENCE_valeur'] ;
    				}
    			}
     
    			//On ajoute aux info utilisateur un tableau contenant les preferences
    			$infos_session->{'UTILISATEUR_preferences'} = null;
    			$infos_session->{'UTILISATEUR_preferences'} = $preferences;
     
    			$storage->clear() ;
    	    	        $storage->write ( $infos_session );	
     
                            //CECI donne bien les nouvelle valeurs de prefrerences donc j'en conclus
                            //que ma session a bien été mise à jour ???
                            var_dump($_SESSION['Zend_Auth']['storage']);
    		}
    Alors j'ai cru comprendre en regardant le constructeur de Zend_Session_Namespace que c'était lui qui initialisé la Session avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Zend_Session::start(true);
    .Est ce normal de démarrer ainsi une session avec Zend ? Ne dois-je pas utiliser Zend_Session::start(); ?

    A la validation de mon formulaire de paramétrage j'appel initParam() pour mettre à jour mes paramètres en session.
    Le var_dump au début de initParam() m'affiche les anciennes valeur et le var_dump à la fin de initParam() m'afiche les nouvelle valeurs que j'ai saisie donc ma session a bien du se mettre à jour. Cependant si je réaffiche la page et que j'affiche ma session je peux voir que les paramétres sont revenu à leurs anciennes valeurs.

    Dans mon formulaire d’édition des paramètres je fait directement appel à initParam() pour mettre à jour ma les infos de ma session. Est ce qu'il ne faudrait pas que je tue et que je recréé ma session ?

    Je sais plus trop comment aborder le problème...

  4. #4
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Bonjour Eljildius,

    Zend, via les noms de session, offre la possibilité de verrouiller la modification d'un espace de nom (Documentation Zend Session Namespace). Vu l'importance de ce namespace, je ne serai pas étonné que zend bloque automatiquement l'écriture (vol de session, etc).

    Du coup, puisqu'il s'agit d'informations liées à un utilisateur qui s'authentifie et que tu souhaite utiliser le namespace 'Zend_Auth' plutôt que celui de ton choix, tu peux utiliser un stockage personnalisé qui dérivera de la classe zend_auth (Documentation Zend Stockage personnalisé).

    Pour répondre à ta question sur l'initialisation de la session, tu trouveras sur le premier lien, en début de page, 4 façons d'instancier la session : 2 sont mauvaises et 2 sont correctes. Personnellement, je privilégie la 4ème.

    Enjoy

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut
    Ah oui j'ai oublié de préciser, pour répondre à Nighty j'ai essayé de prendre un namespace spécifique autre que Zend_auth et ça n'a rien donné j'ai le même problème.

  6. #6
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Rebonjour,

    Dans le cas où tu utilises un autre namespace comment le récupère tu d'un controller à un autre ?

    Personnellement je l'enregistre dans le registre.

    Initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $taSession = new Zend_Session_Namespace('tonNomDeSession');
    Enregistrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $this->lesInfosDeTaSession = CE QUE TU VEUX // array, string, ...
    $taSession->lesInfosDeTaSession = $this->lesInfosDeTaSession;
    Zend_Registry::set('tonNomDeSession', $taSession);
    Lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $taSession = Zend_Registry::get('tonNomDeSession');
    $taSession->getIterator();
    Je me suis fais une factory de session me permettant de créer autant de zend_Session_Namespace dont j'ai besoin avec des fonctions CRUD pour manipuler les données de chaque namespace.

Discussions similaires

  1. [Tomcat] Problème de gestion des session
    Par superzest dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 06/08/2010, 21h26
  2. [PERL]Problème sur la gestion des sessions
    Par LostRailler dans le forum Web
    Réponses: 5
    Dernier message: 03/02/2010, 10h57
  3. [MySQL] problème de gestion des variables de sessions (même navigateur)
    Par alaska750 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/08/2009, 16h59
  4. [FLASH 8] Problème de gestion des clips.
    Par glingo dans le forum Flash
    Réponses: 4
    Dernier message: 09/03/2006, 16h17
  5. [tomcat] gestion des sessions
    Par sebos63 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/10/2004, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo