LDAP Server
In der Regel wird der LDAP Service vom Domain Controller (z.B. Active Directory) zur Verfügung gestellt. Aber auch die Linux Implementierung OpenLDAP kommt teilweise zum Einsatz.
Implementierung
Zunächst setzen wir die grundlegenden Variablen. Der Einfachheit nach setzen wir die Login Daten des zu authentifizierenden Benutzers manuell. Diese können natürlich auch per $_POST oder $_GET von einem Formular entgegengenommen werden.
<?php
// Daten des zu authentifizierenden Benutzers (z.B. aus Formular)
$domain = "foxplex";
$username = "testbenutzer";
$password = "passwort";
// LDAP Daten
$ldap_address = "ldap://ldap.foxplex.com";
$ldap_port = 389;
?>
Im nächsten Schritt wird die Verbindung zum LDAP Server aufgebaut.
<?php
if ($connect = ldap_connect($ldap_address, $ldap_port)) {
// Verbindung erfolgreich
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
} else {
// Verbindung fehlgeschlagen
}
?>
Jetzt können wir innerhalb des Blocks "Verbindung erfolgreich" einen Login Versuch mit dem Benutzer starten. Um den Erfolg oder Misserfolg abzufangen packen wir die Abfrage wieder in einen IF-Block.
<?php
// Authentifizierung des Benutzers
if ($bind = ldap_bind($connect, $domain . "\\" . $username, $password)) {
// Login erfolgreich
} else {
// Login fehlgeschlagen / Benutzer nicht vorhanden
}
?>
Ist der Login erfolgreich fragen wir die notwendigen Daten wie Vorname, Nachname und den Status des Accounts ab. Dies wird in PHP über eine LDAP Suche durchgeführt.
Die Variable $dn ist entsprechend der eigenen Domäne anzupassen.
Über den LDAP Status prüfen wir, ob der Account evtl. gesperrt ist. Wenn ja wird der Benutzer nicht eingeloggt.
Gesamtes Skript
Hier nochmal zusammenfassend das gesamte PHP Skript.
<?php
@session_start();
// Daten des zu authentifizierenden Benutzers (z.B. aus Formular)
$domain = "foxplex";
$username = "testbenutzer";
$password = "passwort";
// LDAP Daten
$ldap_address = "ldap://ldap.foxplex.com";
$ldap_port = 389;
if ($connect = ldap_connect($ldap_address, $ldap_port)) {
// Verbindung erfolgreich
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
// Authentifizierung des Benutzers
if ($bind = ldap_bind($connect, $domain . "\\" . $username, $password)) {
// Login erfolgreich
// Benutzerdaten abfragen
$dn = "DC=foxplex,DC=com";
$person = "$username";
$fields = "(|(samaccountname=*$person*))";
$search = ldap_search($connect, $dn, $fields);
$result = ldap_get_entries($connect, $search);
$ldap_username = $res[0]['samaccountname'][0];
$ldap_first_name = $res[0]['givenname'][0];
$ldap_last_name = $res[0]['sn'][0];
$ldap_status = $res[0]['useraccountcontrol'][0];
ldap_close($connect);
// Prüfen ob Konto gesperrt ist
if ($ldap_status == 512) {
// Nicht gesperrt
$_SESSION['username'] = $ldap_username;
$_SESSION['loggedin'] = true;
return true;
} else {
// Gesperrt
$_SESSION['loggedin'] = false;
return false;
}
} else {
// Login fehlgeschlagen / Benutzer nicht vorhanden
}
} else {
// Verbindung fehlgeschlagen
}?>
Verschlüsselung
Die Übertragung der Daten und damit auch der Passwörter wird bei der oben genannten Lösung unverschlüsselt und im Klartext übertragen. Gerade im Unternehmen sollte man hier die Verbindung mit LDAPS verschlüsseln.
In der Regel genügt es die PHP Variablen für die LDAP Verbindung anzupassen.
<?php
// LDAP Daten mit Verschlüsselung
$ldap_address = "ldaps://ldap.foxplex.com";
$ldap_port = 636;
?>
Funktioniert der Login dann immer noch nicht kann es sein, dass der Server auf dem die PHP Webapplikation läuft dem Zertifikat nicht vertraut.
Dies lässt sich auf einem Linux Server über einen Eintrag in der OpenLDAP Konfiguration /etc/openldap/ldap.conf ändern.
TLS_REQCERT never
Auf einem Windows Server wird die nachfolgende Umgebungsvariable gesetzt:
LDAPTLS_REQCERT=never
Sollten alle Stricke reißen, kann die Option auch noch direkt vor dem ldap_connect in PHP gesetzt werden:
<?php putenv('LDAPTLS_REQCERT=never');?>
Fazit
Mit LDAP steht eine sehr gute zentrale Lösung zur Nutzerverwaltung zu Verfügung. Auch in PHP kann man diese Schnittstelle ohne große Umwege und zusätzlichen Ballast in Form von Klassen nutzen.
Leave a comment