Outils pour utilisateurs

Outils du site


assoceadminphp

Ceci est une ancienne révision du document !


ATTENTION : Cette page n'est plus à jour. Visitez le wiki du projet OpenID d'Arise pour utiliser une authentification PHP.

Comment utiliser l'authentification LDAP avec PHP

Cela peut etre utile pour filtrer l'acces à un site d'assoce, organiser un systeme de vote interne …

Voici une fonction PHP permettant de gérer l'authentification LDAP :

function LDAP_login($login,$pass) {
    $ldap = ldap_connect("ldaps://ldap.iiens.net");
    if(!$ldap) die("Serveur LDAP innaccessible");
 
    if(!ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3))
        echo "Protocole LDAP v3 non disponible => TLS non supporté";
 
    $dn = "uid=$login,ou=People,o=aRiSE,c=fr";
    if (@!ldap_bind($ldap, $dn, $pass) )
            // Erreur d'authentification
            return false;

Si on arrive jusque ici, cela veut dire que l'utilisateur est correctement authentifié. Cela uniquement veut dire que le couple login/mot de passe est correct, mais on ne sait pas encore si l'utilisateur est autorisé à acceder à notre contenu !
Sur l'annuaire d'ARISE, il faut savoir que les anciens auront la possibilité de s'authentifier.

Pour se faire, définissons un filtre, qui correspond uniquement aux personnes à qui on veut autoriser acces :

    $filtre = "(assocemember=cine)";  // on veut autoriser les gens de l'assoce cine uniquement
        // ou "(promo=2008)"     // juste la promo 2008 (promo au sens date de sortie)
        // ou "(|(promo=2008)(promo=2007)(promo=2006))" désigne les 3 promos : le '|' désigne OU
        // ou "(&(sexe=F)(|(promo=2008)(promo=2007)(promo=2006)))" désigne les filles des 3 promos : le '&' désigne ET

Puis spécifions les informations que nous voulons retirer, informations stoquées dans le compte LDAP (trombi quoi), en cas de succes.BR si $attr est vide, tous les attributs vont etre retirés. Les attributs qui peuvent etre utiles sont : uidnumber (entier unique, identifiant numérique d'un eleve), nom, prenom, surnom, mail (iie), mail2 (mail externe, optionnel), assocemember, assocemaster, assoceowner, dateNaissance, promo, uid(=login sur perso)
<code php>
    $attr = array(“uidnumber”,“prenom”,“surnom”,“mail”,“assoceowner”,“assocemaster”);

      // ou array();      // TOUS les champs.
      // ou array("dn")   // si vous ne voulez retirer le moins d'informations

</code>

Lancons la recherche, et testons le retour

    $res=ldap_search($ldap, $dn, $filter, $attr);    // on lance la recherche
    $info=ldap_get_entries($ldap, $res);             // on recupere les resultats
    $num=ldap_count_entries($ldap,$res);             // et le nombre d'entrees
    ldap_unbind($ldap);                              // on se deconnecte, on n'a plus besoin du LDAP
 
    // Est ce que l'acces est autorisé ?
    if( $num!=1 )
        return false;

A ce point du script, l'utilisateur est authentifié, et son acces est autorisé. Il peut etre utile (mais optionel) de retirer quelques informations sur le compte authentitifé.
Pour acceder aux informations du LDAP, voici la syntaxe générale :

    $info[$i][$field][$indice_field] 
      // $i est l'indice qui correspond au numéro de l'entrée
      // $field est le nom du champ qui DOIT etre spécifié dans le tableau $attr
      // $indice_field est l'indice qui selectionne la valeur du champ $field pour ce numéro d'entrée $i 
      //  (un annuaire LDAP est multivalué : un champ peut avoir plusieurs valeurs, pas comme avec une BDD relationelle)
 
      // Si vous etes curieux, vous pouvez voir ce qu'affiche :
      echo "<pre>";
      print_r($info);
      echo "</pre>";

Apres cette parenthese, terminons la fonctions

    return $info[0];   // retourne la premiere entrée, celle qui concerne le compte authentifié
}

On peut donc utiliser la fonction comme suivant :

    $user = LDAP_login($user, $pass);
    if($user) {    // user authentifié !
        echo "Bonjour " . utf8_decode($user["prenom"][0]);
    // ..........
    }
    else echo "Utilisateur non authentifié";

Notez l'utilisation de UTF8_DECODE pour exploiter les champs venus du ldap.

Voici un la fonction complete pour l'assoce mamiie :

function LDAP_login($login,$pass) {
    $ldap = ldap_connect("ldaps://ldap.iiens.net");
    if(!$ldap) die("Serveur LDAP innaccessible");
 
    if(!ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3))
        echo "Protocole LDAP v3 non disponible => TLS non supporté";
 
    $dn = "uid=$login,ou=People,o=aRiSE,c=fr";
    if (@!ldap_bind($ldap, $dn, $pass) ) 
            // Erreur d'authentification
            return false;
 
    $filtre = "(assocemember=mamiie)";
    $attr = array("prenom","surnom","nom");
 
    $res=ldap_search($ldap, $dn, $filter, $attr);    // on lance la recherche
    $info=ldap_get_entries($ldap, $res);             // on recupere les resultats
    $num=ldap_count_entries($ldap,$res);             // et le nombre d'entrees
    ldap_unbind($ldap);                              // on se deconnecte, on n'a plus besoin du LDAP
 
    // Est ce que l'acces est autorisé ?
    if( $num!=1 )
        return false;
 
    return $info[0];   // retourne la premiere entrée, celle qui concerne le compte authentifié
}
assoceadminphp.1351460324.txt.gz · Dernière modification: 2016/03/29 17:01 (modification externe)