Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
je suis nouveau au niveau du framework zend.
Et mon site à une page de connexion où des personnes doivent rentrer leur login et mdp de l'annuaire ldap.
J'ai vu dans la doc qu'il y avait l'adapter ldap pour zend_auth. Seulement comme je suis pas un expert, je voudrais savoir s'il existe une tutoriel en français de zend_auth_ldap et de zend_ldap?
j'ai chercher sur le net mais j'ai trouver que la doc anglaise...
Si quelqu'un connait un bon tutoriel en français ce serait cool ^^
Hors ligne
Perso, je me suis créé une classe héritant simplement de Zend_Auth_Adapter_Interface, qui implémente une méthode authenticate. Dans cette méthode, je fais des bons vieux ldap_connect, ldap_bind, ldap_search, etc., de PHP.
Sachant que j'avais juste à vérifier que login et mdp "bindaient" sur l'annuaire, et que le cas échéant, ils étaient "memberOf" d'un groupe donné, c'était pas bien long à écrire directement dans cette méthode.
Je n'ai donc pas utilisé de Zend_Auth_Ldap ni Zend_Ldap.
Les classes permettant de faire des abstractions sur les fonctions php de base, c'est bien, mais parfois écrire du bon vieux php de base, ça suffit largement (même si j'adore ZF, c'est pas le problème!).
Si ça peut t'aider ...
Hors ligne
oui voila, j'ai déjà du code php avec ldap_bind, ldap_connect... donc ton truc me plait bien finalement ^^
T'aurais un exemple de ta classe s'il te plait, ça pourrait peut être m'aider?
Dernière modification par vince851 (05-05-2010 15:28:52)
Hors ligne
en gros :
<?php #coding: utf-8 /** * adaptateur d'authentification (au sens de Zend Framework) sur l'A.D. * * réalise l'authentification selon login + mot de passe en se connectant à l'A.D., * en vérifiant l'appartenance à un groupe A.D. donné * et renvoie le résultat sous une forme utilisable par un objet Zend_Auth. * @author XXXXXX * @package XXXXXXXXXX * @subpackage XXXXXXX * @category XXXXXXX */ class ADAuthAdapter implements Zend_Auth_Adapter_Interface { /** * @var string */ private $_username; /** * @var string */ private $_password; const _LDAP_HOSTNAME = 'xxxxxxxxxxxxx'; const _LDAP_PORT = 389; const _LDAP_DOMAIN = "xxxxxxx\\"; /** * nom du groupe A.D. des membres autorisés * @var string */ const _AD_AUTHORIZED_GROUP = 'CN=XXXXX,OU=XXXXXX,OU=XXX,OU=XXXXX,DC=XXXX,DC=XXXX'; /** * constructeur * @param string $username nom * @param string $password mot de passe */ public function __construct($username, $password) { $this->_username = $username; $this->_password = $password; } /** * Performs an authentication attempt * * @throws Zend_Auth_Adapter_Exception If authentication cannot be performed * @return Zend_Auth_Result */ public function authenticate() { $ldapConn = ldap_connect(self::_LDAP_HOSTNAME, self::_LDAP_PORT); if (! $ldapConn) { // ======================================== // problème de connexion à l'annuaire ldap // ======================================== return new Zend_Auth_Result( Zend_Auth_Result::FAILURE, null, array('Authentification échouée, problème de connexion à l\'A.D.') ); } // l'utilisateur saisit "nom d'utilisateur", // mais on se binde sur l'A.D. avec <domaine>\\<user> if (! @ldap_bind($ldapConn, self::_LDAP_DOMAIN . $this->_username, $this->_password)) { // ================================== // la personne est inconnue de LDAP // on refuse // ================================== return new Zend_Auth_Result( Zend_Auth_Result::FAILURE, null, /*array(ldap_error($ldapConn)) si on veut le détail */ array('Authentification refusée') ); } // ======================================= // la personne existe bien dans l'A.D. // récupération des infos sur la personne // ======================================= $res = ldap_search( $ldapConn, 'OU=XXXX,DC=XXXX,DC=XXXXX', '(sAMAccountName=' . $this->_username . ')', array('givenname', 'cn', 'sn', 'memberOf') ); if (! $res) { // on ne devrait jamais passer là, puisque qu'on s'est bindé sur le serveur avec justement ces identifiants là return new Zend_Auth_Result( Zend_Auth_Result::FAILURE, null, array('erreur LDAP ' . ldap_errno($ldapConn) . ' - ' . ldap_error($ldapConn)) ); } /* @var $data resource of ldap_result_entry */ $data = ldap_first_entry($ldapConn, $res); ldap_free_result($res); /* liste des groupes de l'utilisateur */ $tabMemberOf = ldap_get_values($ldapConn, $data, 'memberOf'); if (in_array(self::_AD_AUTHORIZED_GROUP, $tabMemberOf)) { // ======================================= // il est membre du groupe autorisé // OK, on lui construit une identité // qu'on renvoie // ======================================= $prenom = ldap_get_values($ldapConn, $data, 'givenname'); $nom = ldap_get_values($ldapConn, $data, 'sn'); ldap_unbind($ldapConn); $identity = array( 'prenom' => $prenom[0], 'nom' => $nom[0] ); return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity); } else { // ========================== // existe bien dans LDAP, mais ne fait partie d'aucun groupe autorisé // on refuse // ========================== return new Zend_Auth_Result( Zend_Auth_Result::FAILURE, null, array('Authentification refusée, vous n\'êtes pas autorisé sur cette application') ); } } }
et par ailleurs :
$auth = Zend_Auth::getInstance(); $result = $auth->authenticate( new ADAuthAdapter( $login, $password ) ); // test du résultat de l'authentification switch ($result->getCode()) { case Zend_Auth_Result::SUCCESS: // connexion OK, do what you want break; case Zend_Auth_Result::FAILURE : default : // connexion niet, do what you want break; }
voilà, en gros
Hors ligne
merci beaucoup c'est plus que bien tout ça ^^
Hors ligne
pheuh a écrit:
en gros :
Code:
<?php #coding: utf-8 /** * adaptateur d'authentification (au sens de Zend Framework) sur l'A.D. * * réalise l'authentification selon login + mot de passe en se connectant à l'A.D., * en vérifiant l'appartenance à un groupe A.D. donné * et renvoie le résultat sous une forme utilisable par un objet Zend_Auth. * @author XXXXXX * @package XXXXXXXXXX * @subpackage XXXXXXX * @category XXXXXXX */ class ADAuthAdapter implements Zend_Auth_Adapter_Interface { /** * @var string */ private $_username; /** * @var string */ private $_password; const _LDAP_HOSTNAME = 'xxxxxxxxxxxxx'; const _LDAP_PORT = 389; const _LDAP_DOMAIN = "xxxxxxx\\"; /** * nom du groupe A.D. des membres autorisés * @var string */ const _AD_AUTHORIZED_GROUP = 'CN=XXXXX,OU=XXXXXX,OU=XXX,OU=XXXXX,DC=XXXX,DC=XXXX'; /** * constructeur * @param string $username nom * @param string $password mot de passe */ public function __construct($username, $password) { $this->_username = $username; $this->_password = $password; } /** * Performs an authentication attempt * * @throws Zend_Auth_Adapter_Exception If authentication cannot be performed * @return Zend_Auth_Result */ public function authenticate() { $ldapConn = ldap_connect(self::_LDAP_HOSTNAME, self::_LDAP_PORT); if (! $ldapConn) { // ======================================== // problème de connexion à l'annuaire ldap // ======================================== return new Zend_Auth_Result( Zend_Auth_Result::FAILURE, null, array('Authentification échouée, problème de connexion à l\'A.D.') ); } // l'utilisateur saisit "nom d'utilisateur", // mais on se binde sur l'A.D. avec <domaine>\\<user> if (! @ldap_bind($ldapConn, self::_LDAP_DOMAIN . $this->_username, $this->_password)) { // ================================== // la personne est inconnue de LDAP // on refuse // ================================== return new Zend_Auth_Result( Zend_Auth_Result::FAILURE, null, /*array(ldap_error($ldapConn)) si on veut le détail */ array('Authentification refusée') ); } // ======================================= // la personne existe bien dans l'A.D. // récupération des infos sur la personne // ======================================= $res = ldap_search( $ldapConn, 'OU=XXXX,DC=XXXX,DC=XXXXX', '(sAMAccountName=' . $this->_username . ')', array('givenname', 'cn', 'sn', 'memberOf') ); if (! $res) { // on ne devrait jamais passer là, puisque qu'on s'est bindé sur le serveur avec justement ces identifiants là return new Zend_Auth_Result( Zend_Auth_Result::FAILURE, null, array('erreur LDAP ' . ldap_errno($ldapConn) . ' - ' . ldap_error($ldapConn)) ); } /* @var $data resource of ldap_result_entry */ $data = ldap_first_entry($ldapConn, $res); ldap_free_result($res); /* liste des groupes de l'utilisateur */ $tabMemberOf = ldap_get_values($ldapConn, $data, 'memberOf'); if (in_array(self::_AD_AUTHORIZED_GROUP, $tabMemberOf)) { // ======================================= // il est membre du groupe autorisé // OK, on lui construit une identité // qu'on renvoie // ======================================= $prenom = ldap_get_values($ldapConn, $data, 'givenname'); $nom = ldap_get_values($ldapConn, $data, 'sn'); ldap_unbind($ldapConn); $identity = array( 'prenom' => $prenom[0], 'nom' => $nom[0] ); return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity); } else { // ========================== // existe bien dans LDAP, mais ne fait partie d'aucun groupe autorisé // on refuse // ========================== return new Zend_Auth_Result( Zend_Auth_Result::FAILURE, null, array('Authentification refusée, vous n\'êtes pas autorisé sur cette application') ); } } }et par ailleurs :
Code:
$auth = Zend_Auth::getInstance(); $result = $auth->authenticate( new ADAuthAdapter( $login, $password ) ); // test du résultat de l'authentification switch ($result->getCode()) { case Zend_Auth_Result::SUCCESS: // connexion OK, do what you want break; case Zend_Auth_Result::FAILURE : default : // connexion niet, do what you want break; }voilà, en gros
me revoila^^ j'aurais voulu savoir où il fallait mettre la classe ADAuthAdapter ? dans le controller ou ailleurs?
et pareil pour le 2è code, je suis un peut paumé ...
Hors ligne
Merci beaucoup pour le partage pheuh
Hors ligne
Je n'ai donc pas utilisé de Zend_Auth_Ldap ni Zend_Ldap.
Hors ligne