Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
La version 2.1 de Zend Framework est toute neuve, et je suis en train de basculer une application 2.0. Comme annoncé Authenticate a été touché, sans que je trouve de la doc tangible a ce sujet.
Je me retrouve donc avec une fonction de ma table utilisateur qui ne fonctionne plus.
public function Authenticate(User $user, $password)
{
$authAdapter = new AuthAdapter($this->adapter, $this->table,'username','password');
$authAdapter->setIdentity($user->username)->setCredential($password);
$auth = new AuthenticationService();
return $auth->authenticate($authAdapter);
}
Qui a une idée des changements effectués? Merci par avance...
Dernière modification par jfvole (07-02-2013 10:39:26)
Hors ligne
Salut, effectivement il y a eu des modifications qui ont été apportée sur ce composant.
Voici comment fonctionne l'authentification chez moi :
Dans la classe UserService (ou dans un contrôleur)
[lang=php]public function authenticate($login, $password) { $auth = $this->getAuthenticationService(); $adapter = $auth->getAdapter(); $adapter->setIdentityValue($login) ->setCredentialValue($password); $authResult = $auth->authenticate(); if (!$authResult->isValid()) { throw new \UnexpectedValueException('Le login ou le mot de passe est incorrect'); } $user = $authResult->getIdentity(); // Récupère l'utilisateur authentifié } /** * @return AuthenticationService */ public function getAuthenticationService() { if (!$this->authenticationService) { $this->setAuthenticationService( $this->getServiceManager()->get('Zend\Authentication\AuthenticationService') ); } return $this->authenticationService; }
Dans Module.php
[lang=php]// Je ne sais pas si tu utilises doctrine mais voici dans ton Module.php pour définir le service d'authentification de doctrine à la place de celui du ZF2 dans factories (mais il me semble que ça implémente la même interface donc ça doit fonctionner dans les deux cas. 'Zend\Authentication\AuthenticationService' => function($sm) { return $sm->get('doctrine.authenticationservice.orm_default'); },
Dans mon module.config.php
[lang=php] 'doctrine' => array( 'authentication' => array( 'orm_default' => array( 'object_manager' => 'Doctrine\ORM\Entity\Manager', 'identity_class' => 'Application\Entity\Membre', 'identity_property' => 'login', 'credential_property' => 'password', 'credential_callable' => function (Membre $user, $passwordGiven) { return $user->authenticate($passwordGiven); } ), ), ),
Tu dois pouvoir adapter ça pour utiliser avec celui du ZF2 il doit y avoir quelque chose de semblable.
Hors ligne
Merci pour ta réponse. Mon code marche très bien avec ZF 2.0. Ce qu'il me manque c'est justement ce qui a changé avec ZF 2.1, pour pouvoir modifier mon code.
Hors ligne
Justement ce que je t'ai montré tiens compte des nouveautés apportés par la 2.1 normalement
Hors ligne
Alors, de mémoire, en gros le changement c'est qu'une partie de la logique que l'on effectuait manuellement a été intégré nativement dans les adapters.
Une nouvelle interface a été ajoutée, ValidatableAdapterInterface (afin de ne pas casser la compatibilité), qui contient les fonctions get/setIdentity et get/setPassword.
La classe AbstractAdapter a été ajoutée et implémente cette nouvelle interface. La plupart des adapters (dont DbTable) héritent maintenant d'AbstractAdapter plutôt que de simplement implémenter AdapterInterface comme c'était le cas avant.
Comme chaque adapter dispose maintenant du mot de passe et de l'identity, toute la logique a pu être implémentée directement dans les adapters.
Orkin: tu utilises l'adapter de Doctrine donc ton exemple ne fonctionnera pas s'il utilise un autre adapter (DbTable...).
En gros, l'idée c'est que tu créés ton adapter, tu lui passes le mot de passe et l'identité en appelant les fonctions setCredential et setIdentity, tu donnes cet adapter à l'AuthenticationService et hop, t'appelle la fonciton authenticate. Rien d'autre à faire .
EDIT : en fait, ça change pas grand chose à l'utilisation. Ce changement a été réalisé dans le but de créer un nouveau validateur, Authentication.
Hors ligne
Merci pour ta réponse.
Je n'utilise pas Doctrine mais un DbAdapter.
Concretement ca change quoi pour le code que j'ai actuellement. J'ai comparer les doc de ZF2.0 et ZF2.1 sans voir de différence.
http://framework.zend.com/manual/2.1/en … table.html
A moins que la doc ne soit pas a jour...
Dernière modification par jfvole (04-02-2013 17:34:58)
Hors ligne
C'est un peu hors sujet quoique pas vraiment, quel est le meilleur moyen pour vous pour accéder aux informations de l'utilisateur connecté dans les vues ? ViewHelper ?
Hors ligne
Bonjour,
@lepiou, j'ai un $currentUser, issue de l'authentification, stocké en session, que je passe systématiquement au layout et aux vues.
Hors ligne
Bonjour à tous,
Orkin, la fonction authenticate($login, $password) fait bien partie d'un controller ?
La fonction ci-dessous permet de récupérer une factorie de ton module.php ?
$this->getServiceManager()->get('Zend\Authentication\AuthenticationService');
J'ai un peu de mal avec le code posté, est-ce possible d'avoir un aperçu plus précis du controller contenant la fonction authenticate et du module.php ?
Merci par avance
Hors ligne
adloiseau a écrit:
Bonjour à tous,
Orkin, la fonction authenticate($login, $password) fait bien partie d'un controller ?
La fonction ci-dessous permet de récupérer une factorie de ton module.php ?Code:
$this->getServiceManager()->get('Zend\Authentication\AuthenticationService');J'ai un peu de mal avec le code posté, est-ce possible d'avoir un aperçu plus précis du controller contenant la fonction authenticate et du module.php ?
Merci par avance
La fonction authenticate est une fonction de ma classe UserService mais tu peux la déclarer dans un contrôleur si tu veux cependant ça fait moins propre.
En fait $this->getServiceManager()->get('Zend\Authentication\AuthenticationService'); permet de récupérer tout simplement le service d'authentification du ZF2. Le service manager va se charger lui même de charger la factory qui va bien s'il y en a une et dans le cas contraire instancier la classe pour te retourner une classe AuthenticationService
En fait je peux pas être beaucoup plus précis. Je vais éditer pour préciser les classes impliquées mais en gros j'ai une action dans mon contrôleur qui est appelée lorsque l'utilisateur soumet le formulaire de connexion. Dans cette fonction je vérifie que le formulaire est valide etc ... (grosso modo le cycle de validation classique d'une soumission de formulaire, j'ai pas mon code sous les yeux mais de mémoire je l'ai déporté dans un service mais pour faire plus simple tu peux le laisser dans le contrôleur). Une fois que le formulaire est validé tu appelles la fonction authenticate en lui passant en paramètre le login et le mot de passe que l'utilisateur a saisi (pas besoin de faire les opérations de cryptage, hashage et compagnie). Dans cette fonction je transmet le login et password à l'adapter de l'AuthenticationService et ensuite c'est la fonction définie dans le credential_callable qui fait la validation entre le mot de passe saisie et le mot de passe de l'utilisateur. Ah oui, une chose à savoir (je sais pas si c'est le cas pour DbAdapter mais ça l'est pour doctrine) l'adapter va récupérer l'utilisateur en base en fonction de son login uniquement (dans la requête SQL) et ne tiens pas compte du mot de passe. C'est la fonction du credential_callable qui fait cette vérification, si cette fonction renvoie true alors la session est créée dans le cas contraire pas de session .
Hors ligne
Merci d'avoir répondu à mes questions
Hors ligne
Je reviens avec des précisions supplémentaires.
La seule doc dont je dispose est le test de Zend:
https://github.com/zendframework/zf2/bl … leTest.php
et pour la branche 2.0 https://github.com/zendframework/zf2/bl … leTest.php
L'authentification est codé ainsi dans les 2 versions.
public function testAuthenticateSuccess() { $this->_adapter->setIdentity('my_username'); $this->_adapter->setCredential('my_password'); $result = $this->_adapter->authenticate(); $this->assertTrue($result->isValid()); }
A ce niveau rien n'est donc changé.
Par contre ma fonction etait ainsi avec ZF2.0 en faisant appel a AuthenticationService ce qui n'est pas ce qui se fait dans le test.
public function Authenticate(User $user, $password) { $authAdapter = new AuthAdapter($this->adapter, $this->table,'username','password'); $authAdapter->setIdentity($user->username)->setCredential($password); $auth = new AuthenticationService(); return $auth->authenticate($authAdapter); }
J'ai donc mis mon code en conformité avec le test en appelant authenticate sur adapter, et non sur le service.
Avec ZF2.0 L'authentification échoue, mais pas d'erreur. Il y a donc bien un soucis a ce niveau.
Avec ZF2.1 J'ai 3 erreurs... Les mêmes, aux mêmes lignes que mon code d'origine avec ZF2.1
Zend\Authentication\Adapter\Exception\RuntimeException File: /var/www/app/ZF2.1/library/Zend/Authentication/Adapter/DbTable.php:375 Message: The supplied parameters to DbTable failed to produce a valid sql statement, please check table and column names for validity. ... Zend\Db\Adapter\Exception\InvalidQueryException File: /var/www/app/ZF2.1/library/Zend/Db/Adapter/Driver/Pdo/Statement.php:245 Message: Statement could not be executed ... PDOException File: /var/www/app/ZF2.1/library/Zend/Db/Adapter/Driver/Pdo/Statement.php:240 Message: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
Je reste perplexe sur les erreurs. Il va sans dire que mon appli se sert de la table Users par ailleurs sans soucis
Hors ligne
Là pour t'aider c'est pas simple ... Tu nous mets le code que tu avais avant et les erreurs du nouveau sans nous montrer le nouveau :p. A vu de nez je dirais que tu fais mal quelque chose :p. De plus si tu es en 2.1 te soucis pas de savoir si ça fonctionne en 2.0 car les 2 versions ne sont pas totalement compatibles.
Hors ligne
Comme je l'ai indiqué dans mon message mon code correspond a celui des test...
donc
public function Authenticate(User $user, $password) { $authAdapter = new AuthAdapter($this->adapter, $this->table,'username','password'); $authAdapter->setIdentity($user->username); $authAdapter->setCredential($password); return $authAdapter->authenticate(); }
Si je fais le parallèle entre les deux versions c'est que les test sont identiques. Que la façon de coder n'a pas changé. Et que mon problème semble le même aussi avec mon ancien code et le nouveau.
Le changement n'est donc pas dans la façon de faire l'authentification, mais ailleurs dans les tables ou SQL.
Hors ligne
Ok j'avais mal lu alors au temps pour moi . Effectivement ça vient d'ailleurs mais dans ce cas je sais pas trop comment t'aider :s
Hors ligne
Finalement la version 2.1 etait buggée...
https://github.com/zendframework/zf2/issues/3623
Le temps de télécharger la version 2.1.1 et de tester et je reviens vers vous
Hors ligne
Ok merci pour le retour
Hors ligne
Tout est rentré dans l'ordre avec cette nouvelle version... Mon code ne bouge donc pas.
Hors ligne
Orkin a écrit:
Dans mon application.config.php
Code:
[lang=php] 'doctrine' => array( 'authentication' => array( 'orm_default' => array( 'object_manager' => 'Doctrine\ORM\Entity\Manager', 'identity_class' => 'Application\Entity\Membre', 'identity_property' => 'login', 'credential_property' => 'password', 'credential_callable' => function (Membre $user, $passwordGiven) { return $user->authenticate($passwordGiven); } ), ), ),
Je ne comprends pas cette portion de code? et pourquoi le fait tu dans application.config.php ?
Hors ligne
C'est moi qui ai dit des bêtises c'est dans module.config.php. J'ai édité mon poste pour les autres. Et tu as un peu plus d'explications ici : https://github.com/doctrine/DoctrineMod … ication.md
Hors ligne
Bonjour j'ai un soucis avec l'authentification depuis plus de 4jours j'ai essayé tous les tuto mais rien en fait je veux authentifier mes utilisateurs avec de leur donné accès a mon application voila mon code je ne sais ce qui ne marche pas urgent j'ai besoin d'aide
private function getAuthAdapter() {
$authAdapter = new Zend_Auth_Adapter_DbTable(
Zend_Db_Table::getDefaultAdapter());
$authAdapter->setTableName('users') // the db table where i stored users
->setIdentityColumn('name') // the name of user
->setCredentialColumn('password')// the password of user
->setCredentialTreatment('MD5(?)');
return $authAdapter;
}
public function logoutAction(){
Zend_Auth::getInstance()->clearIdentity();
$this->_helper->_redirector('index','index');
}
public function authenticatAction(){
$request = $this -> getRequest();
if (Zend_Auth::getInstance()){
$this->_helper->_redirector('index','index');
}
$username = $request->getPost('name');
$password = $request->getPost('password');
//////print $username.$password;
if ($username != "" && $password != "") {
$authAdapter = $this->getAuthAdapter ();
$authAdapter->setIdentity($username)
->setCredential(md5($password));
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);
if($result->isValid()){
$identity = $authAdapter->getResultRowObject();
$authStorage = $auth->getStorage();
$authStorage->write($identity);
$this->_helper->_redirector('list','user');
}
}
}
Hors ligne
jai pas d'erreur mais l'authentification échoue
Hors ligne