Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Membre habitué Avatar de Vespiras
    Homme Profil pro Alexandre
    Développeur informatique
    Inscrit en
    décembre 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 105
    Points : 121
    Points
    121

    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 :
    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 habitué Avatar de Vespiras
    Homme Profil pro Alexandre
    Développeur informatique
    Inscrit en
    décembre 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 105
    Points : 121
    Points
    121

    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 :
    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 :
    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 !

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •