Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 30-04-2011 16:27:07

pepito35
Membre
Date d'inscription: 12-03-2011
Messages: 16

[RESOLU]raffraichissement Zend_Auth après modification profil

Bonjour,

Pour les besoins de mon application, je cherche à réactualiser ou raffraîchir les données contenues dans Zend_Auth après qu'un utilisateur ait modifié son profil sans provoquer de déconnexion.
Mais je n'y parviens pas.

Pouvez vous me dire si cela reste possible et comment y arriver?

Vous remerciant par avance.

Cordialement,

Pepito35

Dernière modification par pepito35 (04-05-2011 14:07:19)

Hors ligne

 

#2 01-05-2011 14:19:36

nuxwin
Membre
Lieu: Caen (14)
Date d'inscription: 17-03-2011
Messages: 66

Re: [RESOLU]raffraichissement Zend_Auth après modification profil

Bonjour ;

Je déduis de votre question que vous stockez les informations du profil utilisateur au travers de Zend_Auth...

Ce que vous demandez est faisable mais lourd. Pouvez vous être un peu plus explicite, donner plus d'infos à propos de ce que vous désirez modifier comme information dans l'espace de nom de Zend_Auth ?

Cordialement ;

Dernière modification par nuxwin (01-05-2011 15:19:23)

Hors ligne

 

#3 01-05-2011 15:32:29

pepito35
Membre
Date d'inscription: 12-03-2011
Messages: 16

Re: [RESOLU]raffraichissement Zend_Auth après modification profil

Bonjour,

Merci pour votre réponse. C'est exactement ça je stocke les infos profil dans zend auth. Je rappelle ces infos lors d'une validation de panier. Si elles sont jugées éronnées par l'utilisateur (adresse par exemple), il va les corriger sur son profil et revenir sur la visualisation du panier. Les infos sont bien modifiées dans la database sauf que comme je les affiche avec Zend_Auth l'utilisateur est obligé de se reconnecter pour voir sur la page de visualisation du panier que ses infos ont bien été modifiées. Pour éviter cela, j'aurais pensé raffraichir zend_auth après chaque appel de l'action modifiant le profil aurait été facilement envisageable... mais si c'est lourd, je pense m'orienter vers une autre solution...

Cordialement.

Hors ligne

 

#4 02-05-2011 00:36:09

nuxwin
Membre
Lieu: Caen (14)
Date d'inscription: 17-03-2011
Messages: 66

Re: [RESOLU]raffraichissement Zend_Auth après modification profil

Re ;

C'est bien ce que j'avais compris. Le fait est que vous utilisez Zend_Auth pour autre chose de ce pourquoi il a été initialement conçu. Pour des raisons de performances, vous pouvez bien entendu stocker certaines données en session mais pas dans l'espace de nom créé par le composant Zend_Auth. Vous avez pris un raccourci qui comme vous le voyez maintenant, n'est pas sans vous poser quelques problèmes...

Je vais maintenant essayer de vous proposer une autre solution qui à mon sens est plus appropriée à votre problème:

Actuellement, vous avez une table disons 'users', laquelle contient un champ 'username', un champ 'password' ainsi qu'un champ supplémentaire 'is_active' qui indique si le compte est actif ou non. Cette table contient en outre d'autre champs, notamment un champs 'address', un champs 'phone'...

Normalement, la procédure d'authentification repose uniquement sur les trois premiers champs (username, password, is_active), le troisième étant optionnel . Pour authentifier un utilisateur avec Zend_Auth, vous procéder grossièrement comme ceci:

Code:

[lang=php]
class User_AccountController extends Zend_Controller_Action

    public function loginAction()
    {
        $auth = Zend_Auth::getInstance();
        if(!auth->hasIdentity()) {
            $form = new User_Form_Login();

            if ($this->_request->isPost() && $form->isValid($this->_request->getPost('loginForm', array()))) {
                $authDbAdapter = new Zend_Auth_Adapter_DbTable(
                    null,'users', 'username', 'password', 'MD5(?) AND is_active = 1'
                );
                $authDbAdapter->setIdentity($username)->setCredential($password);
                $result = $authDbAdapter->authenticate();

                if ($result->isValid()) {
                    // Protection against session's fixation attacks
                    Zend_Session::regenerateId();
                    Zend_Auth::getInstance()->getStorage()->write($authDbAdapter->getResultRowObject(null, 'password'));
                    $this->_redirect('/'); // User is now logged in - back to home page
                }
            }

            $this->assign('loginForm', $loginForm); // User is not authenticated or some authentication data are wrong
        }
        // User is already logged in - back to home page
        $this->_redirect('/');    
    }
}

Comme vous pouvez le voir ici (et c'est, je le pense, ce que vous faite aussi), nous stockons en session la ligne récupérée dans sa totalité, hormis le mot de passe qui est explicitement écarté pour des raisons de sécurités. Ainsi, ce n'est pas seulement les informations liées à l'authentification qui sont enregistrées dans l'espace de nom 'Zend_Auth' mais une ligne de table complète, celle-ci pouvant contenir des informations totalement étrangères au processus d'authentification. Il est évident que normalement, vous ne devriez conserver dans l'espace de nom 'Zend_Auth' que des informations liées au processus d'authentification et non d'autres informations comme celles provenant des champs 'address' et 'phone' ...

Imaginez que les données permettant l'authentification (username, password, is_active) d'un utilisateur soient situées dans une autre table, que feriez vous ?  La question que vous devez vous posez ici est: Est-ce que j'ai vraiment besoin que l'adresse de mon utilisateur réside en session ou puis-je me contenter de récupérer cette information seulement lorsque j'en ai besoin ? Et si je veux vraiment que cette information persiste en session, est-ce que l'espace de nom 'Zend_Auth' et le bon endroit pour stocker cette information ?

Pour ma part, je pense que l'espace de nom 'Zend_Auth' ne devrait rien contenir d'autre qu'un marqueur permettant d'indiquer que l'utilisateur et authentifié :

Code:

[lang=php]
$identity = $result->getIdentity();
Zend_Auth::getInstance()->getStorage()->write($identity->uid);

Ici, je stocke l'identifiant de l'utilisateur. Cette donnée agit comme marqueur mais permet aussi de retrouvez facilement l'identifiant unique de l'utilisateur tout au long de la session.

En faisant cela vous répondez à deux questions:

- Vous ne stockez dans l'espace 'Zend_Auth' rien d'autre que ce qui vous permet d'affirmer que l'utilisateur et authentifié ;
- Vous n'avez plus à chercher comment modifier les information contenues dans cet espace de nom.

Maintenant, si vous désirez toujours conserver en session les informations rattachées au profil de l'utilisateur, comme une adresse, un numéro de téléphone, une adresse email, vous pouvez toujours créer une aide d'action comme suite:

Code:

[lang=php]
class XXXX_Controller_Action_Helper_Profil extends Zend_Controller_Action_Helper_Abstract {

    /**
     * Perform helper when called as $this->_helper->Profil() from an action controller
     *
     * Proxies to {@link getProfil()}
     *
     * @return object user profil information
     */
    public function direct()
    {
        return $this->getProfil();
    }

    /**
     * Returns user profil information from session
     *
     * This method will try to retrieve current authenticated user profile information
     * from session and to return them as object. If data are not already stored in
     * session, they will be fetched from the database and  stored into it and finally
     * returned as object.
     *
     * @return object user profil information
     */
    public function getProfil() {
        Zend_Session::start(); // Ensuring that session is started
        $userProfileNamespace = new Zend_Session_Namespace('userProfileNamespace');

        if(!isset($userProfileNamespace->profile)) {
            /**
             * @var $db Zend_Db_Adapter_Abstract
             */
            $db = Zend_Registry::get('db');
            $select = $db->select()->from('users')->where('uid = ?', Zend_Auth::getInstance()->getIdentity()->uid);
            $profileData = $db->query($select)->fetch(Zend_Db::FETCH_OBJ);
            $userProfileNamespace->profil = $profileData;

        }

        return userProfileNamespace->profile;
    }

    /**
     * Flush profil from session
     * @return void
     */
    public function flush()
    {
        Zend_Session::start();
        Zend_Session::namespaceUnset('userProfileNamespace');
    }
}

Ici, on a donc créer une aide d'action qui pourra être utilisée dans tous les contrôleurs. Les informations liées au profil de utilisateur seront récupérées qu'une seul fois par session ce qui se traduit par une seul requête. Cette aide d'action fournit aussi une méthode flush() qui permet d'invalider les informations stockées en session. Elle seront donc rechargées à partir de la base de données au prochain appel de la méthode getProfil().

Notez qu'il s'agit ici que d'un exemple non testé et surtout codé à l'arraché. Aussi, vous devriez désormais savoir comment modifier les informations se trouvant dans l'espace de nom 'Zend_Auth' qui est similaire à l'espace de nom 'userProfileNamespace'.

Cordialement ;

Dernière modification par nuxwin (02-05-2011 09:43:18)

Hors ligne

 

#5 02-05-2011 04:04:15

pepito35
Membre
Date d'inscription: 12-03-2011
Messages: 16

Re: [RESOLU]raffraichissement Zend_Auth après modification profil

Bonjour,

Je vous remercie beaucoup pour votre explication détaillée et ce superbe exemple que je testerai d'ici peu. Je pourrais normalement l'implémenter facilement car j'ai déjà quelque chose de similaire aux  premières portions de code.

Merci encore pour votre précieuse aide.

Cordialement.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages