Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-05-2010 12:10:06

vince851
Membre
Date d'inscription: 04-05-2010
Messages: 28

Authentification via ldap

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

 

#2 05-05-2010 15:21:10

pheuh
Membre
Date d'inscription: 18-03-2010
Messages: 22

Re: Authentification via ldap

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

 

#3 05-05-2010 15:27:47

vince851
Membre
Date d'inscription: 04-05-2010
Messages: 28

Re: Authentification via ldap

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

 

#4 06-05-2010 11:13:45

pheuh
Membre
Date d'inscription: 18-03-2010
Messages: 22

Re: Authentification via ldap

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

Hors ligne

 

#5 06-05-2010 12:29:04

vince851
Membre
Date d'inscription: 04-05-2010
Messages: 28

Re: Authentification via ldap

merci beaucoup c'est plus que bien tout ça ^^

Hors ligne

 

#6 08-06-2010 08:55:42

vince851
Membre
Date d'inscription: 04-05-2010
Messages: 28

Re: Authentification via ldap

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

 

#7 03-01-2012 15:19:29

Njörd
Nouveau membre
Date d'inscription: 03-01-2012
Messages: 2

Re: Authentification via ldap

Merci beaucoup pour le partage pheuh wink

Hors ligne

 

#8 17-04-2012 04:57:42

chuying0810
Membre
Date d'inscription: 17-04-2012
Messages: 15

Re: Authentification via ldap

Je n'ai donc pas utilisé de Zend_Auth_Ldap ni Zend_Ldap. http://www.bosin.info/google.gif

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