Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Salut à tous
Le système d'authentification de ZF à l'avantage de la simplicité
mais souvent ce qui détermine l'accès à une ressource ce n'est pas l'identité de l'utilisateur mais le profil qui a dans l'application.
si vous avez une relation un utilisateur à un profil vous pouvez enbarquer votre profil directement dans l'authentification. vous avez surpement un bout de code qui resemble à
Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable'); $dbAdapter = Zend_Registry::get('dbAdapter'); $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); $authAdapter->setTableName('users'); $authAdapter->setIdentityColumn('username'); $authAdapter->setCredentialColumn('password'); // Set the input credential values to authenticate against $authAdapter->setIdentity($username); $authAdapter->setCredential($password); // do the authentication $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if ($result->isValid()) { // success: store database row to auth's storage // system. (Not the password though!) $data = $authAdapter->getResultRowObject(null, 'password'); $auth->getStorage()->write($data); ..
ce qui nous intéresse c'est la ligne
$authAdapter->setTableName('users');
créez une vue dans votre base ainsi
CREATE VIEW auth_user AS SELECT * FROM user INNER JOIN profil USING (prf_id);
Je vous laisse deviner la structure des tables
remplacez $authAdapter->setTableName('users'); par
$authAdapter->setTableName('auth_user');
Vous avez maintenant dans les donnez d'authentification le user et son profil.
si comme moi un utilisateur peut avoir plusieurs profil vous devez après le login lui proposer la liste de ses profil pour en choisir un. une fois qu'il l'a choisit vous pouvez intéger ces information dans le données d'authentification
$auth = zend_Auth::getInstance()->getStorage(); $userData = $auth ->read(); foreach ($profile as $key => $value){ //$profile est le profil choisit par l'utilisateur. $userData->$key = $value; } $auth ->write($userData);
là encore vous avez dans les données d'authentification l'ensemble des information nécessaire.
A+JYT
Hors ligne
Si tu décides d'écrire des tutoriaux, je me ferais un plaisir de faire pointer quelques liens dessus
Merci pour les infos, Philippe
Hors ligne
Bonjour,
je débute en ZF et j'essaie de comprendre comment marche l'authentification à partir du tuto de Rob Allen qui ressemble au code du premier post de ce fil.
est-ce que le storage par defaut qu'on a avec $auth->getStorage() est une "vraie session" ?
j'ai essayé de faire un getId() dessus mais ça me retourne une erreur. Si ce n'est pas une session, comment faire pour créer une session à partir de cette procédure d'authentification ?
Mon besoin est bien sûr de conserver la session pour les requetes suivantes du même utilisateur.
je n'ai pas trouvé de lien dans la doc entre ce getStorage() et les Zend_Session
Hors ligne
Cela utilise bien une Zend_Session.
$this->user = Zend_Auth::getInstance()->getIdentity();
Ca a mettre dans un controller et le tour est joué., tu à acces au donnée récupéré lors du
$data = $authAdapter->getResultRowObject(null, 'password'); $auth->getStorage()->write($data);
Hors ligne
Mr.MoOx a écrit:
Cela utilise bien une Zend_Session.
ok mais le code suivant ne marche pas
$sid = Zend_Auth::getInstance()->getStorage()->getId();
j'ai l'erreur : Fatal error: Call to undefined method Zend_Auth_Storage_Session::getId()
Comment peut-on récuperer l'id de cette session ?
Edit : je peux le récupérer avec la fonction PHP session_id() mais j'aurais aimé coder cela en ZF...
Dernière modification par andras (12-10-2007 14:33:03)
Hors ligne
Arès avoir relu la doc de ZF, j'en conclu que Zend_Auth::getInstance()->getStorage() renvoie un objet de type Zend_Auth_Storage_Session qui n'est pas une Zend_Session : on ne peut donc pas récupérer l'Id de la session qui a été crée sauf en utilisant directement la fonction PHP session_id().
mais effectivement on n'a pas logiquement besoin d'accéder directement à la session elle-même.
Pour stocker les infos du user on fait $auth->getStorage()->write($data);
et pour les récupérer dans une page suivante on fait : Zend_Auth::getInstance()->getIdentity();
ce n'est pas très intuitif (en tout cas pour moi) car on ne passe pas par les mêmes objets pour lire et écrire les données de session mais bon, c'est comme ça.
Hors ligne
andras a écrit:
j'en conclu que Zend_Auth::getInstance()->getStorage() renvoie un objet de type Zend_Auth_Storage_Session qui n'est pas une Zend_Session
J'ai cru comprendre ça aussi.
Dans ce cas, comment peut-on faire en sorte d'utiliser une vrai session ? Je ne trouve pas que la doc soit bien faite sur ce point, il me manque pas mal d'éléments.
De plus, est-il possible de passer d'un objet Zend_Auth_Storage_Session à un objet Zend_Session_Namespace et inversement ? Je m'explique : après m'être connecter sur un LDAP, je souhaite passer les paramètres dans une session. Pour le moment, juste avant l'authentification à proprement dit, j'utilise :
$userInfoSession = new Zend_Auth_Storage_Session('userInfoSession'); $auth->setStorage($userInfoSession);
Et après la connexion, je souhaite mettre certaines infos comme un "username" en session. J'utilise donc :
$userInfoSession->username = $resultLdap->getIdentity();
Ca fonctionne sur la vue en cours, mais si je change de page, il ne me récupère plus les infos. Je pense que ca vient du fait que je n'utilise pas une vrai session. Quelle solution peut-être utilisée ? Existe-t-il un vrai tutorial sur le package Zend_Session ?
Hors ligne
Lo-chan,
Si tu as trouvé la solution à ton problème, je crois que ça pourrait résoudre le mien..
merci!
Hors ligne
je ne comprends pas quel est le problème
la session est gérée par Zend_Session
Zend_Auth gère l'authentification
A+jyt
Hors ligne
Bonjour,
Avec print_r($_SESSION), ne peut t'on pas voir comment Zend_Auth gère la persistance ?
Hors ligne
Lo-chan a écrit:
andras a écrit:
j'en conclu que Zend_Auth::getInstance()->getStorage() renvoie un objet de type Zend_Auth_Storage_Session qui n'est pas une Zend_Session
J'ai cru comprendre ça aussi.
Dans ce cas, comment peut-on faire en sorte d'utiliser une vrai session ? Je ne trouve pas que la doc soit bien faite sur ce point, il me manque pas mal d'éléments.
De plus, est-il possible de passer d'un objet Zend_Auth_Storage_Session à un objet Zend_Session_Namespace et inversement ? Je m'explique : après m'être connecter sur un LDAP, je souhaite passer les paramètres dans une session. Pour le moment, juste avant l'authentification à proprement dit, j'utilise :Code:
$userInfoSession = new Zend_Auth_Storage_Session('userInfoSession'); $auth->setStorage($userInfoSession);Et après la connexion, je souhaite mettre certaines infos comme un "username" en session. J'utilise donc :
Code:
$userInfoSession->username = $resultLdap->getIdentity();Ca fonctionne sur la vue en cours, mais si je change de page, il ne me récupère plus les infos. Je pense que ca vient du fait que je n'utilise pas une vrai session. Quelle solution peut-être utilisée ? Existe-t-il un vrai tutorial sur le package Zend_Session ?
Cette ligne écrit les infos dans la session
$auth->getStorage()->write($data);
oui si tu fais print_r($_SESSION); tu verras comment la session est géré par zend.
Hors ligne