PHP und LDAP

Ich habe mich in den vergangenen Tagen ein wenig mit dem Ausführen von LDAP Kommandos aus PHP heraus beschäftigt. Mit dem unten gezeigten Code ist es möglich, einzelne Attribute aus einem LDAP Verzeichnis auszulesen und zu modifizieren.

Beispiel: Verzeichniseintrag von John Doe; Anzeigen und ändern der Email-Adresse.

Der Code ist vielleicht etwas umfangreicher als er für diese kleine Aufgabe sein müsste, aber ich erhoffe mir so etwas mehr Flexibilität für zukünftige Aufgaben. In der von mir genutzten Variante kommt $modifiedDigest aus einer Formulareingabe, während ich in diesem Beispiel der Einfachheit halber einen bereits festgelegten Eintrag nutze.
Feedback zu den PHP-Zeilen ist sehr gerne gesehen, ich bin immer froh wenn ich etwas neues von erfahreneren Mitmenschen lernen kann. Bisher habe ich nur wenig Erfahrung mit PHP gesammelt und auch noch keinen Code veröffentlicht.

Zunächst einmal der verkürzte Eintrag aus dem Verzeichnis:

1
2
3
# john, people, example.com
dn: uid=john,ou=people,dc=example,dc=com
mail: john@doe.com

Jetzt der Code für die LDAP Operationen: LDAPCONNECT stellt eine Verbindung zum Directory Server (DS) her. LDAPv3 habe ich dabei festgeschrieben, der Rest ist entsprechend variabel gehalten. LDAPSEARCH schickt eine Suchabfrage an den DS und gibt die Ergebnisse in einem Array zurück. LDAPMODIFY ändert ein Attribut unter dem angegebenen DN. Die Funktionen habe ich in eine andere Datei ldapCommands.php ausgelagert, die im Ordner includes liegt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php 
function LDAPCONNECT ($ldapServer, $ldapPort, $ldapUser, $ldapPass, $ldapDeref, $ldapDerefInt) {     
    $ldapResourceId = ldap_connect($ldapServer, $ldapPort);
    ldap_set_option($ldapResourceId, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldapResourceId, $ldapDeref, $ldapDerefInt);
    ldap_bind($ldapResourceId, $ldapUser, $ldapPass); 
    return $ldapResourceId;
} 
 
function LDAPSEARCH ($ldapDn, $ldapUid, $ldapFilter, $ldapAttributes, $ldapResourceId) {     
    $sri = ldap_search($ldapResourceId, $ldapUid . $ldapDn, $ldapFilter, $ldapAttributes);
    $ldapResult = ldap_get_entries($ldapResourceId, $sri);
    return $ldapResult; 
}
 
function LDAPMODIFY ($ldapResourceId, $ldapDn, $modificationEntry) {
    ldap_modify($ldapResourceId, $ldapDn, $modificationEntry);
}
?>

Nach dem Einbinden der ldapCommands.php setze ich Werte für die benötigten Variablen. Über LDAPCONNECT wird die Verbindung zum DS hergestellt, anschließend per LDAPSEARCH er aktuelle Wert eingelesen und ausgegeben. Das Ergebnis aus dem LDAPSEARCH wird dann auch für die Modifikation des Eintrages genutzt, da einer der zurückgelieferten Einträge im Ergebnis-Array der vollständige, für die Modifikation notwendige Distinguished Name ist.

Anschließend lösche ich mit ldap_free_result($r) das letzte Suchergebnis und starte den Suchvorgang erneut. Jetzt erscheint die neu eingetragene Adresse als Ergebnis. Zum Ende folgt noch die Abmeldung vom DS mittels ldap_unbind($r). Wenn ich das im Netzwerkmitschnitt richtig verfolgt habe, erfolgt diese Abmeldung vom Verzeichnisserver auch, wenn ich die Codezeile weglasse. Ich spekuliere aber einfach mal, dass die Aufgabe so etwas „sauberer“ gelöst ist :).

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
<?php 
include ("includes/ldapCommands.php");
 
$ldapUser = "cn=admin,dc=example,dc=com"; 
$ldapPass = "InsertPasswordHere"; 
$ldapDn = ",ou=people,dc=example,dc=com"; 
$ldapServer = "localhost"; 
$ldapPort = 389; 
$ldapFilter = "objectclass=inetOrgPerson"; 
$ldapUid = "uid=john"; 
$ldapAttributes = array("mail"); 
$ldapDeref = LDAP_DEREF_FINDING; 
$ldapDerefInt = 2; 
$modifiedDigest["mail"] = "newjohn@doe.com";
 
$r = LDAPCONNECT($ldapServer, $ldapPort, $ldapUser, $ldapPass, $ldapDeref, $ldapDerefInt);  
$emailResult = LDAPSEARCH($ldapDn, $ldapUid, $ldapFilter, $ldapAttributes, $r); 
echo $emailResult[0][$ldapAttributes[0]][0];
 
LDAPMODIFY($r, $emailResult[0]["dn"], $modifiedDigest);
 
ldap_free_result($r);
 
$emailResult = LDAPSEARCH($ldapDn, $ldapUid, $ldapFilter, $ldapAttributes, $r); 
echo $emailResult[0][$ldapAttributes[0]][0];
 
ldap_unbind($r);
?>

Zur Überprüfung erneut die LDAP-Ausgabe:

1
2
3
4
# Verkürzte Ausgabe
# john, people, example.com
dn: uid=john,ou=people,dc=example,dc=com
mail: newjohn@doe.com
 

mkriesten

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*