Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-02-2013 15:01:53

jfvole
Membre
Date d'inscription: 20-11-2010
Messages: 69

[Résolu] ZF 2.1 Authenticate

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

 

#2 04-02-2013 15:19:39

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] ZF 2.1 Authenticate

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)

Code:

[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

Code:

[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

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);
                }
            ),
        ),
    ),

Tu dois pouvoir adapter ça pour utiliser avec celui du ZF2 il doit y avoir quelque chose de semblable.

Hors ligne

 

#3 04-02-2013 16:10:39

jfvole
Membre
Date d'inscription: 20-11-2010
Messages: 69

Re: [Résolu] ZF 2.1 Authenticate

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

 

#4 04-02-2013 16:31:57

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] ZF 2.1 Authenticate

Justement ce que je t'ai montré tiens compte des nouveautés apportés par la 2.1 normalement

Hors ligne

 

#5 04-02-2013 17:19:53

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [Résolu] ZF 2.1 Authenticate

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 smile.


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

 

#6 04-02-2013 17:34:07

jfvole
Membre
Date d'inscription: 20-11-2010
Messages: 69

Re: [Résolu] ZF 2.1 Authenticate

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

 

#7 05-02-2013 10:24:09

lepiou
Membre
Date d'inscription: 17-10-2012
Messages: 19

Re: [Résolu] ZF 2.1 Authenticate

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

 

#8 05-02-2013 11:19:45

jfvole
Membre
Date d'inscription: 20-11-2010
Messages: 69

Re: [Résolu] ZF 2.1 Authenticate

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

 

#9 05-02-2013 14:46:52

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [Résolu] ZF 2.1 Authenticate

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

Hors ligne

 

#10 05-02-2013 22:14:17

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] ZF 2.1 Authenticate

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 smile.

Hors ligne

 

#11 06-02-2013 08:07:01

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [Résolu] ZF 2.1 Authenticate

Merci d'avoir répondu à mes questions wink

Hors ligne

 

#12 06-02-2013 10:55:13

jfvole
Membre
Date d'inscription: 20-11-2010
Messages: 69

Re: [Résolu] ZF 2.1 Authenticate

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.

Code:

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.

Code:

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

Code:

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

 

#13 06-02-2013 11:27:33

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] ZF 2.1 Authenticate

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

 

#14 06-02-2013 11:37:27

jfvole
Membre
Date d'inscription: 20-11-2010
Messages: 69

Re: [Résolu] ZF 2.1 Authenticate

Comme je l'ai indiqué dans mon message mon code correspond a celui des test...

donc

Code:

    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

 

#15 06-02-2013 11:58:04

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] ZF 2.1 Authenticate

Ok j'avais mal lu alors au temps pour moi big_smile. Effectivement ça vient d'ailleurs mais dans ce cas je sais pas trop comment t'aider :s

Hors ligne

 

#16 07-02-2013 07:25:43

jfvole
Membre
Date d'inscription: 20-11-2010
Messages: 69

Re: [Résolu] ZF 2.1 Authenticate

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

 

#17 07-02-2013 09:46:57

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] ZF 2.1 Authenticate

Ok merci pour le retour big_smile

Hors ligne

 

#18 07-02-2013 10:38:57

jfvole
Membre
Date d'inscription: 20-11-2010
Messages: 69

Re: [Résolu] ZF 2.1 Authenticate

Tout est rentré dans l'ordre avec cette nouvelle version... Mon code ne bouge donc pas.

Hors ligne

 

#19 08-02-2013 10:08:00

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [Résolu] ZF 2.1 Authenticate

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

 

#20 08-02-2013 10:17:51

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] ZF 2.1 Authenticate

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

 

#21 07-03-2013 11:19:11

dorian
Nouveau membre
Date d'inscription: 07-03-2013
Messages: 3

Re: [Résolu] ZF 2.1 Authenticate

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

 

#22 07-03-2013 11:26:47

dorian
Nouveau membre
Date d'inscription: 07-03-2013
Messages: 3

Re: [Résolu] ZF 2.1 Authenticate

jai pas d'erreur mais l'authentification échoue

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