IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

LDAP récupérer la liste de OU


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut LDAP récupérer la liste de OU
    Bonjour à tous,

    C'est la première fois que je poste ici, et sachez que j'ai beaucoup cherché sur le forum (et sur d'autres sites d'ailleurs) avant de me résigner.
    Voici mon problème :

    Je veux créer une interface web de login (hebergé sur un apache) qui va taper directement dans une base LDAP sur un Active Directory, qui est sur un autre serveur que mon apache.
    J'utilise OpenLDAP et PHP pour ce faire, et je rencontre un problème.

    L'indentification couple login/mdp fonctionne très bien, mais lorsque je me connecte en anonyme, et que je veux lister les OU existants, rien ne se passe, et je n'ai pas d'erreurs dans le log.

    Voici le code concerné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    $connexion_serveur = ldap_connect($ldap_server, $ldap_port) or die ("Impossible de se connecter au serveur LDAP");
     
    // On définit ici la version LDAP (OBLIGATOIRE!!!)
    ldap_set_option($connexion_serveur, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($connexion_serveur, LDAP_OPT_REFERRALS, 0);	// Sans cette ligne, ldap_search et ldap_list ne fonctionnent pas !
     
     
    // Si connexion OK & utilisateur appartient à l'OU Admin alors :
    // connexion avec un mdp précis dans une OU précise : $connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_informatique, $passwd))
    //ldap_bind($connexion_serveur);	// connexion anonyme
     
    echo "connecté anon";
    $tab_arg=array("ou");
    $filtre = "ou=*";
    /*  peut etre utiliser ldap_list(), car on peut lui préciser un filtre apparament plus affiné */
    //$sr = ldap_list($connexion_serveur, $ldap_base, $filtre, $tab_arg);	
    $sr=ldap_search($connexion_serveur, $ldap_base, $filtre);
     
    $info = ldap_get_entries($connexion_serveur, $sr);
     
    for ($i=0; $i < $info["count"]; $i++) 
    {
    	echo $info[$i]["ou"][0]; 
    	echo "    ";
    } 
     
    	$_SESSION['admin']=0;
    INFOS :
    - Lorsque je suis connecté avec mon compte (compte classique dans l'AD), il arrive à me trouver toutes les OU (seulement les OU racines, juste en dessous du DN racine)
    - j'ai essayé avec ou sans les "@" devant les fonctions de liens LDAP (bind, connect,...)

    QUESTIONS :
    - Avec ldap_search ou ldap_list, comment définit-on un niveau de filtre plus avancé que LDAP_SCOLE_LEVELONE ? (Pour aller chercher dans les sous-OU de l'arborescence)
    - Les connexions anonymes sont-elles autorisées à accéder en lecture aux infos racines de la base LDAP ?
    - Y a t'il une abération, ou des remarques sur mon code (je n'ai pas tout mis, hein )

    Merci d'avances pour vos réponses, mais aussi pour m'avoir lu !
    Cdt,

    Vespiras

  2. #2
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut
    Bon j'ai résolu mon problème

    Les comptes anonymes n'ont aucun droit, c'est pourquoi je me log avec une couple login/mot de passe valide afin de faire mes recherches d'entrées.
    Recherches que je fais grâce à ldap_search, car cette fonction recherche dans TOUTE l'arborescence, et non pas au premier niveau après la racine, comme le fait ldap_list ( testé et approuvé sur le LDAP d'un AD hebergé sur un Windows Server 2008).

    Et les abérations sur mon code ne sont pas nombreuses étant donné qu'il manquait pleins de choses.

    Je poste le morceau de mon code final, ça pourra peut être servir un jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    // Création de la variable "$connexion_serveur" ou l'on indique les informations pour interroger la base
    $connexion_serveur = @ldap_connect($ldap_server, $ldap_port) or die("Impossible de se connecter au serveur LDAP");
     
    // On définit ici la version LDAP (OBLIGATOIRE!!!)
    ldap_set_option($connexion_serveur, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($connexion_serveur, LDAP_OPT_REFERRALS, 0);	// Pour liaison avec l'AD
    //error_reporting(E_ALL ^ E_NOTICE);   //Supprime des messages inutiles
     
     
    if($connexion_user=@ldap_bind($connexion_serveur, $user_default, $pwd_user_default)) 
    //ldap_bind($connexion_serveur);	// Connexion anonyme (aucun droit en lecture, donc NON)
    {
    	echo "Test debug 1: On cherche : ".htmlspecialchars($user)."<br><br>";
    	$searchFor=$user;               // On veut chercher l'utilisateur qui vient de se logger
    	$searchField="samaccountname";	// Par rapport au champ "samaccountname"
    	$trouver_champs = array("distinguishedname","cn");
    	$filtre="($searchField=$searchFor)"; //      $filtre = "ou=*"
    	$sr=ldap_search($connexion_serveur, $ldap_base, $filtre, $trouver_champs);	//On cherche les champs de $trouver_champs, avec le filtrage $filtre.
     
    	$info = ldap_get_entries($connexion_serveur, $sr);	// On récupère les entrées dans $info
     
    	$nb_occurences =0;
    	for ($i=0; $i < $info["count"]; $i++) // On les stockes dans des variables indépendantes
    	{
    		$user_ou=$info[$i]["distinguishedname"][0];
    		$user_cn=$info[$i]["cn"][0];
    		echo "Chemin complet : ".$user_ou."<br>"; 
    		echo "NOM Complet : ".$user_cn;
    		echo "<br>";
    		$nb_occurences = $i+1;
    	} 
    	echo "Test debug 2: Il y a ".$nb_occurences." occurence(s) trouvee(s) !";
     
    	//$_SESSION['admin']=0;
    	ldap_unbind($connexion_serveur);	// On se déconnecte
    }
    Ensuite, après le déconnexion, j'ai stocké comme il faut le chemin complet de l'utilisateur dans ses OU dans $user_ou, et je me connecte avec le mot de passe récupéré en $_POST précédement, comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Puis on se reconnecte avec cette fois le couple login/mdp saisis
    $connexion_serveur = @ldap_connect($ldap_server, $ldap_port) or die("Impossible de se connecter au serveur LDAP");	
     
    if($connexion_user=@ldap_bind($connexion_serveur, $user_ou, $passwd))	//on se lie
    Ça marche du tonnerre ! Si on oublie pas la sécurité sur le login/mdp récupéré en $_POST (elles ne sont pas vides, caractères spéciaux, etc ... ) tout est bon !

    Il me manque juste à refuser les connexions anonymes sur mon LDAP, car pour le moment on peut se connecter avec n'importe quel couple login/mdp, même si on a accès à rien, je voudrais arranger ca. Si quelqu'un à une idée je suis preneur !

Discussions similaires

  1. Récupérer la liste des thread "Stopped" : JNDI Ldap
    Par inflation dans le forum Général Java
    Réponses: 7
    Dernier message: 25/05/2011, 17h30
  2. [LDAP] Récupérer la liste des personnes d'un annuaire
    Par Longrais dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 22/11/2006, 17h49
  3. Comment récupérer la liste des contacts de outlook express?
    Par arnaud_verlaine dans le forum Outlook Express / Windows Mail
    Réponses: 6
    Dernier message: 12/10/2004, 15h53
  4. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 17h41
  5. Récupèrer la liste des disques durs
    Par Tililian dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/06/2003, 12h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo