Code zur ldap-suche erläutern

Hallo,
nach und nach treibt mich ldap dem Wahn etwas näher.
ich versuche gerade den folgenden Code, der mir hier im Forum zur Verfügung gestellt wurde genau zu verstehen.

<?php

$ldap_server    = "ldaps://<UrlDesLdapServers>/";
$ldap_basedn    = "ou=schools,dc=linuxmuster,dc=lan";
$ldap_binduser  = 'cn=<BindUser>,ou=Management,ou=GLOBAL,dc=linuxmuster,dc=lan';
$ldap_bindpw    = '<BindPassword>';

$username = "<Kuerzel>";

// connect to ldap_server
if ($ldap_connection=@ldap_connect($ldap_server)) {
  // bind to ldap connection
  if (($ldap_bind=@ldap_bind($ldap_connection, $ldap_binduser, $ldap_bindpw)) == false) {
    echo "Cannot bind to '$ldap_server'";
    @ldap_close($ldap_connection);
    exit();
  }
  // search for user
  else if (($res_id = ldap_search($ldap_connection, $ldap_basedn, "cn=$username")) == false) {
    echo "No user found";
    @ldap_close($ldap_connection);
    exit();
  }
  else {
	  $user_entries = ldap_get_entries($ldap_connection, $res_id);
    $user_groups = $user_entries[0]["memberof"];
    $groups = array();
    foreach ($user_groups as $key => $group) {
      if ($key !== "count") {
        array_push($groups, strtok(substr($group, 3), ','));
      }
    }
    print_r($groups);
    @ldap_close($ldap_connection);
  }
}
else {
  echo "No connection to '$ldap_server'";
}

?>

Ich verstehe nun folgenden Teil nicht

  $user_entries = ldap_get_entries($ldap_connection, $res_id);
    $user_groups = $user_entries[0]["memberof"];
    $groups = array();
    foreach ($user_groups as $key => $group) {
      if ($key !== "count") {
        array_push($groups, strtok(substr($group, 3), ','));

Die erste Zeile kann ich noch nachvollziehen, aber was gescheit dann im zweidimensionalen Array?
Wenn ich bei mir user_entries per print_r ausgebe wird nichts angezeigt.

Ich habe mal members of durch OU=Abteilung ersetzt, da wusste ich wenigstens, dass es belegt ist.
Da wird dann ein array ausgegeben, allerdings totales durcheinander.

Es würde mich freuen, wenn mir jemand erklären könnte, was in diesem codeausschnitt genau passiert. Ich verstehe auch nicht, warum hier anscheinend Strings zerlegt werden mit strtok?

Vielen Dank im Voraus
Milo

Hallo Milo,

bitte entschuldige die späte Rückmeldung, aber ich habe momentan unglaublich viel zu tun. Zu meinem Codebeispiel:

$user_entries = ldap_get_entries($ldap_connection, $res_id);

… fragt nach den Einträgen zu oben spezifiziertem User (eingegrenzt durch cn=$username).

Wenn du mit print_r($user_entries) diese Einträge ausgibst, kannst du schauen, was das für dich relevante Attribut ist um die Gruppen des Users auszulesen. Bei unserer lmn7-Umgebung ist dies das Attribut memberof. Daher die Zeile

$user_groups = $user_entries[0]["memberof"];

Hier werden alle Einträge des Attributs memberof des ersten Users, für den die ldap-Suche erfolgreich war (es könnten ja prinzipiell auch mehrere sein…), abgerufen. Anschließend iteriere ich mittels

foreach ($user_groups as $key => $group) {
  if ($key !== "count") {
    array_push($groups, strtok(substr($group, 3), ','));
  }
}

über diese Einträge und schreibe sie in das Array $groups.

Wenn bei dir der print_r($user_entries)-Befehl nichts ausgibt, dann liegt das daran, dass dein User voraussichtlich nicht gefunden wurde. Wird denn die Nachricht „No user found“ ausgegeben?

Viele Grüße
Christoph

Hallo Christoph,

vielen Dank für die Erläuterung, das macht die ganze Sache klarer.
Ausgegeben wird bei mir mit print_r($user_entries) alle dn, von allen Usern.

Kennst Du zufällig einen richtig guten Kurs/ein Buch zur Verwendung von LDAP in codes.
Sowas könnte auch künftig interessant sein.

Viele Grüße
Milo

Hallo Milo,

wenn bei Dir nur die dn-Felder ausgegeben werden - verwendest Du beim ldap_search-Befehl den Parameter „attributes“ (wie in Deinem Beispiel aus dem anderen Thread)? Wenn ja, dann lass den mal weg, dann sollten alle Felder ausgegeben werden.

Beste Grüße

Jörg