Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1825 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU] LDAP groupe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] LDAP groupe

n°2301234
Dolb66
Posté le 29-05-2017 à 10:31:37  profilanswer
 

:bounce: Hello
 
J'ai mon script qui fonctionne bien pour la connexion au serveur ldap de l'entreprise qui me prend en stage
(je place des * sur les noms de domaines car je ne pense pas que mon entreprise souhaiterai ce partage  :p )

Code :
  1. <?php
  2. /**
  3. * Connexion a la DB
  4. */
  5. try
  6. {
  7.     $bdd = new PDO('mysql:host=localhost;dbname=ldap_rep', 'root', '');
  8. $bdd->exec("SET CHARACTER SET utf8" );
  9. }
  10. catch(Exception $e)
  11. {
  12.         die('Erreur : '.$e->getMessage());
  13. }
  14. /*
  15. * ----------------------------------------------------------------------------------------------
  16. * Variables de connection
  17. */
  18. $Conf_LDAP_Server = '*********************'; // "MyServer.MyDomain";
  19. $Conf_Def_Dom     = '********'; //"MyDomain";
  20. //-------------------------------------------------------------
  21. if(isset($_POST['username']) && isset($_POST['password'])){
  22.     $adServer = "ldap://".$Conf_LDAP_Server;
  23.     $ldap = ldap_connect($adServer);
  24.     $username = $_POST['username'];
  25.     $password = $_POST['password'];
  26.     $ldaprdn =  $Conf_Def_Dom."\\".$username;
  27.     ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
  28.     ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
  29.     $bind = @ldap_bind($ldap, $ldaprdn, $password);
  30.     if ($bind) {
  31.         $filter="(sAMAccountName=$username)";
  32.         $result = ldap_search($ldap,"dc=*****,dc=******,dc=*****",$filter);
  33.         $info = ldap_get_entries($ldap, $result);
  34.         for ($i=0; $i<$info["count"]; $i++)
  35.         {
  36.             if($info['count'] > 1)
  37.                 break;
  38.          
  39.            
  40. ?>


 
Suivit de mon formulaire html.
Tout sa marche, maintenant j'aimerai rediriger l'utilisateur qui se connecte, selon le service/groupe auquel il appartient sur l'AD (Active Directory)
à une page spécifique.
 
Je pense premièrement à la méthode if/else , ou switch
Mais je ne comprend vraiment pas comment je retrouve les groupes de l'AD par script php.
 
J'ai vu qu'il y avait le ldap_search avec les groupes "OU=", mais l'entreprise a énormément de groupe donc je pense qu'il y a une autre méthode.
J'ai également vu la méthode MemberOf mais je ne l'a comprend pas vraiment.
 
Quelqu'un pour m'indiquer la démarche à suivre?  
 
Merci  :wahoo:


Message édité par Dolb66 le 31-05-2017 à 10:14:55
mood
Publicité
Posté le 29-05-2017 à 10:31:37  profilanswer
 

n°2301239
TotalRecal​l
Posté le 29-05-2017 à 12:07:18  profilanswer
 

Pour une grosse entreprise, c'est assez vraisemblable qu'un même utilisateur soit dans des dizaines de groupes différents.

 

Perso (en .Net, pas en PHP, mais niveau principe c'est pareil) pour implémenter ça je récupère pour un login en un seul appel au serveur LDAP la liste de tous ses groupes, et je fais ma popote dessus pour savoir à quoi il a droit. C'est juste un gros string array.

 

C'est plus ou moins ce que tu as l'air de faire, mais je n'ai pas compris ton problème exact et surtout ce que fait ta dernière boucle mystérieuse.


Message édité par TotalRecall le 29-05-2017 à 12:08:54

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2301240
Dolb66
Posté le 29-05-2017 à 14:09:03  profilanswer
 

Pour la dernière boucle, s'est juste que j'ai montré la partie haute de mon code ( sa continue plus bas ).
 
Dans un premier temps j'ai essayé de récupérer la liste des groupes en rajoutant ceci dans mon code :  

Code :
  1. $base_dn="dc=******,dc=*****,dc=****";
  2.        /*....*/
  3.         $filter2= "(objectclass=group)";
  4.         $recherchegroupe = ldap_search($ldap, $base_dn, $filter2);
  5. $resultatgroupe = ldap_get_entries($ldap, $recherchegroupe);
  6. echo 'Groupe(s) correspondant(s) à l\'utilisateur : ' .$resultatgroupe['count'] . '<br />';
  7. $tabGroupAd = array();
  8. for ($i = 0; $i < $resultatgroupe['count']; $i++) {
  9.         $tabGroupAd[strtr($resultatgroupe[$i]['name'][0]," ","-" )] = $resultatgroupe[$i]['name'][0];
  10. }
  11. asort($tabGroupAd);
  12. foreach ($tabGroupAd as $selectionresultat => $affichageresultat) {
  13.         echo '<option value=' . $selectionresultat . '>' . $affichageresultat .'</option>';
  14. }


 
Donc avec sa j'ai la liste de tout les groupes, cependant il me faut savoir "Dans quels groupes je suis (car oui tu as raison un utilisateur possède plusieurs groupe)
Pour cela j'essaie de faire différent test avec mon filter comme :
 

Code :
  1. filter2="(&(objectCategory=group)(sAMAccountName=$username)";


 
Mais sa me retourne toujours 0  :cry:  :cry:


Message édité par Dolb66 le 29-05-2017 à 14:11:16
n°2301241
TotalRecal​l
Posté le 29-05-2017 à 15:37:48  profilanswer
 

La syntaxe LDAP c'est sans doute super bien quand tu es admin sys et que tu la maitrises, mais si tu as besoin de faire des trucs un peu spécifiques (genre moi je fais du pattern matching par expression régulière sur mes groupes), comme je te disais : ça me parait considérablement plus simple d'utiliser LDAP juste pour choper tous les groupes de l'utilisateur, et de faire ta sélection après en parcourant la liste brute comme un troupeau de chaînes.  
Je ne bite rien à ton PHP mais donc pas besoin de bidouiller un filtre côté LDAP.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2301243
Dolb66
Posté le 29-05-2017 à 15:59:08  profilanswer
 

"ça me parait considérablement plus simple d'utiliser LDAP juste pour choper tous les groupes de l'utilisateur" -> C'est justement ce que je cherche à faire, mon code actuel me permet de chopper tous les groupes du LDAP. Je cherche la requête ou le filtre qui me permet de justement savoir quel groupe sont liés à mon utilisateur.
 
Si j'arrive à faire cela, avec un simple switch je serai capable de rediriger l'utilisateur selon son appartenance.
 
Cdlt

n°2301244
Dolb66
Posté le 29-05-2017 à 16:12:15  profilanswer
 

Code :
  1. /*
  2. * ----------------------------------------------------------------------------------------------
  3. * Variables de connection
  4. */
  5. $Conf_LDAP_Server = '*********************'; // "MyServer.MyDomain";
  6. $Conf_Def_Dom     = '***'; //"MyDomain";
  7. //-------------------------------------------------------------
  8. if(isset($_POST['username']) && isset($_POST['password'])){
  9.     $adServer = "ldap://".$Conf_LDAP_Server;
  10.     $ldap = ldap_connect($adServer);
  11.     $username = $_POST['username'];
  12.     $password = $_POST['password'];
  13. $base_dn="dc=******,dc=********,dc=****";
  14.     $ldaprdn =  $Conf_Def_Dom."\\".$username;
  15.     ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
  16.     ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
  17.     $bind = @ldap_bind($ldap, $ldaprdn, $password);
  18.     if ($bind) {
  19.  $filter= "(|(objectclass=group)(memberOf=*CN=*, OU=Users))";                 
  20.  $recherchegroupe = ldap_search($ldap, $base_dn, $filter);
  21.  $resultatgroupe = ldap_get_entries($ldap, $recherchegroupe);
  22. echo 'Groupe(s) correspondant(s) à l\'utilisateur : ' .$resultatgroupe['count'] . '<br />';
  23. $tabGroupAd = array();
  24. for ($i = 0; $i < $resultatgroupe['count']; $i++) {
  25.     $tabGroupAd[strtr($resultatgroupe[$i]['name'][0]," ","-" )] = $resultatgroupe[$i]['name'][0];


 
Sur mon $filter j'utilise un filtre sur ma recherche, j'ai essayé plusieurs filtre comme  

Code :
  1. $filter= "(|(sAMAccountName=$username)(objectclass=group)(memberOf=*CN=*, OU=Users))";


 
Lorsque je met l'opérateur OU ( | ) Sa m'affiche normalement la liste complète des groupes.
Lorsque je met l'opérateur ET ( & ) Sa m'affiche 0 résultat, donc mon erreur provient du filtrage


Message édité par Dolb66 le 29-05-2017 à 16:13:27
n°2301245
TotalRecal​l
Posté le 29-05-2017 à 17:29:07  profilanswer
 

J'ai l'impression qu'actuellement tu filtres sur le groupe mais je ne connais rien à la syntaxe LDAP. Dans tous les cas tu n'as pas besoin de combiner des filtres quelque soit l'opérateur si tu fais comme je disais, à savoir récupérer tous les groupes de ton utilisateur...
Tu peux déjà faire un bête filtre avec :
"(cn=USERNAME)" avec ton login dans "username", sans rien de plus.
En précisant de renvoyer la propriété memberOf.
Et dans memberOf tu auras ta liste de groupes.

 

en cherchant juste sur "ldap_get_entries memberof" en 10s j'ai l'impression d'avoir la réponse donc je ne vois pas trop sur quoi tu galères : https://samjlevy.com/use-php-and-ld [...] ary-group/ ?


Message édité par TotalRecall le 29-05-2017 à 17:30:37

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2301278
Dolb66
Posté le 30-05-2017 à 09:27:44  profilanswer
 

Merci pour tes réponses, malgré tout ce qu'il fait ne marche pas chez moi, et je galère car je ne connais rien non plus a cette syntaxe, je connaissais même pas LDAP y a une semaine.  
 
J'ai bien rajouté le CN=$Username dans ma $base_dn et laissé le memberof dans mon filtre mais sans aucun retour.  
 
Je vais continuer à faire des tests, je vous tiens au courrant

n°2301279
TotalRecal​l
Posté le 30-05-2017 à 09:47:18  profilanswer
 

Et avec mon lien et les 12000 autres pour faire la même chose ?
En passant éventuellement par un client LDAP (windows si besoin) pour te familiariser avec les principes et ne plus tester en aveugle ?


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2301280
Dolb66
Posté le 30-05-2017 à 10:06:45  profilanswer
 

Je comprends, mais je t'assure que je regarde la doc depuis plus de 5 jours sur tout ce qui concerne LDAP, l'entreprise où j'effectue mon stage ne me donne pas tout les privilèges sur mon pc, pour pas mal de chose j'ai l'accès restreint et je dois donc tester en aveugle en esperant que sa marche. Mais merci tu m'as bien aidé je pense que je vais trouver :)

mood
Publicité
Posté le 30-05-2017 à 10:06:45  profilanswer
 

n°2301281
TotalRecal​l
Posté le 30-05-2017 à 10:14:24  profilanswer
 

C'est pour ça que je te conseillais de rester simple : je trouve la syntaxe LDAP bizarre, les concepts bizarres, etc.  
Donc comme je l'ai déjà rabaché :  
- fais simple, utilise le serveur LDAP juste pour récupérer tes groupes de ton utilisateur, ne te lance pas dans des filtres complexes, c'est bcp plus pratique à faire a posteriori.
- teste avec un client LDAP pour savoir ce que ton code va recevoir.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2301291
Dolb66
Posté le 30-05-2017 à 11:02:37  profilanswer
 

Il faut que sa marche pour tout utilisateurs, de différents groupes donc sans filtrage c'est difficile,
j'ai repris la fonction que tu m'as mit dans le lien, mais à l'appel de celle-ci, soit je n'ai rien, soit j'ai une erreur sur la valeur de sortie qui me dit qu'elle n'est pas initialisé, ce qui est faux.
Vois tu une erreur? ou une différence avec son code, franchement sa me rend dingue, je cherche les erreurs partout
 

Code :
  1. function get_groups($username, $password) {
  2. $Conf_LDAP_Server = '*******************************'; // "MyServer.MyDomain";
  3. $Conf_Def_Dom     = '***'; //"MyDomain";
  4. // Active Directory server
  5. $adServer = "ldap://".$Conf_LDAP_Server;
  6.     $ldap = ldap_connect($adServer);
  7. $ldap_dn="CN=Users, dc=****,dc=*****,dc=****";
  8.     $ldaprdn =  $Conf_Def_Dom."\\".$username;
  9.     ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
  10.     ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
  11.     $bind = @ldap_bind($ldap, $ldaprdn, $password);
  12. if ($bind) {
  13. // Search AD
  14. $results = ldap_search($ldap,$ldap_dn,"(samaccountname=$username)",array("memberof","primarygroupid" ));
  15. $entries = ldap_get_entries($ldap, $results);
  16. // No information found, bad user
  17. if($entries['count'] == 0) return false;
  18. // Get groups and primary group token
  19. $output = $entries[0]['memberof'];
  20. $token = $entries[0]['primarygroupid'][0];
  21. // Remove extraneous first entry
  22. array_shift($output);
  23. // We need to look up the primary group, get list of all groups
  24. $results2 = ldap_search($ldap,$ldap_dn,"(objectcategory=group)",array("distinguishedname","primarygrouptoken" ));
  25. $entries2 = ldap_get_entries($ldap, $results2);
  26. // Remove extraneous first entry
  27. array_shift($entries2);
  28. // Loop through and find group with a matching primary group token
  29. foreach($entries2 as $e) {
  30.  if($e['primarygrouptoken'][0] == $token) {
  31.   // Primary group found, add it to output array
  32.   $output[] = $e['distinguishedname'][0];
  33.   // Break loop
  34.   break;
  35.  }
  36. }
  37. }
  38. return $output;
  39. }


 
ps : J'ai deja regarder mes groupes mais bon il faut que sa agisse pour tous
 
 
Merci pour le temps que tu m'as/me consacre  :hello:

n°2301292
Dolb66
Posté le 30-05-2017 à 11:06:44  profilanswer
 

Pour mon erreur du $output je l'avais placé une parenthese trop tard :3 maintenant que sa ne m'affiche aucune erreur, je ne vois pas pourquoi dans ma page php principal lorsque je demande :  
 
print_r(get_groups('$username', '$password'));
 
Rien ne s'affiche

n°2301376
roondar
Posté le 30-05-2017 à 23:43:07  profilanswer
 

Ce que dit totalrecall est bon.
En gros tu fais une recherche sur ce filtre =
(samaccountname=toto)
Et tu récupères la propriété memberof.
Tu vas récupérer un tableau de tous les DN de groupe auquel appartient l'utilisateur.
À toi de faire une nouvelle requête ldap pour trouver le nom du groupe avec son DN.
À vu d'œil, ce lien est OK https://samjlevy.com/use-php-and-ld [...] ary-group/


Message édité par roondar le 30-05-2017 à 23:44:42
n°2301382
Dolb66
Posté le 31-05-2017 à 07:57:33  profilanswer
 

Merci tout fonctionne correctement à présent,
Mon erreur venait pas de moi au final, mais de mon entreprise qui s'est trompé dans le CN qu'ils m'ont donnés ! Perdre 6 heures pour un détails comme sa c'est un peu bête... Je vous remercie pour vos reponses


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU] LDAP groupe

 

Sujets relatifs
LDAP TO SQLGroupe programmation Java
[VBS] Script d'intégration dans un groupe de sécuritéAutomatiser détection faciale et numérotation d’une photo de groupe
Reproduire ligne avec plusieurs Cases d'option/Zone de groupe ET MacroAide:extraire un groupe de données depuis un groupe de fichiers
groupe et grantLdap et php blocage de session
[PHP] SSO avec LDAP[AD - LDAP] Ajout d'un nouvel utilisateur dans un groupe
Plus de sujets relatifs à : [RESOLU] LDAP groupe



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR