Anmeldedaten sind gültig * - false -> Anmeldedaten sind fachlich ungültig (z. B. falsches Passwort) * Technische Fehler (z. B. falsche Konfiguration, keine Verbindung) werden als Exception geworfen. */ class LdapAuthService { /** @var array LDAP-spezifische Konfiguration (Server, Port, Domain-Suffix, Timeout, etc.) */ private array $config; /** * Erwartet den Teilbereich "ldap" aus der allgemeinen Konfiguration (config.php). * * @param array $ldapConfig Konfiguration für die LDAP-Verbindung */ public function __construct(array $ldapConfig) { // LDAP-Konfiguration in der Instanz speichern. $this->config = $ldapConfig; } /** * Führt die eigentliche LDAP/AD-Authentifizierung durch. * * @param string $username Benutzername (ohne Domain-Suffix, z. B. "administrator") * @param string $password Passwort im Klartext (wird direkt an ldap_bind übergeben) * * @return bool true bei erfolgreicher Anmeldung, false bei fachlich ungültigen Anmeldedaten * * @throws RuntimeException bei technischen Problemen (z. B. fehlende Konfiguration, Verbindungsfehler) */ public function authenticate(string $username, string $password): bool { // Wenn Benutzername oder Passwort leer sind, gar nicht erst versuchen zu binden. // Das ist ein fachlich ungültiger Login und wird mit false behandelt. if ($username === '' || $password === '') { return false; } // Benötigte Werte aus der LDAP-Konfiguration auslesen. // Falls einzelne Werte fehlen, werden sinnvolle Standardwerte gesetzt. $server = (string)($this->config['server'] ?? ''); $port = (int)($this->config['port'] ?? 389); $domainSuffix = (string)($this->config['domain_suffix'] ?? ''); $timeout = (int)($this->config['timeout'] ?? 5); // Ohne Server-Adresse oder Domain-Suffix ist eine sinnvolle Anmeldung nicht möglich. // Das ist ein Konfigurationsfehler und wird als technischer Fehler behandelt. if ($server === '' || $domainSuffix === '') { throw new RuntimeException('LDAP-Konfiguration ist unvollständig.'); } // Verbindung zum LDAP/AD-Server herstellen. // Rückgabewert ist eine Ressource (Verbindungshandle) oder false bei Fehlern. $connection = ldap_connect($server, $port); if ($connection === false) { throw new RuntimeException('LDAP-Verbindung konnte nicht aufgebaut werden.'); } // LDAP-Optionen setzen: // - Protokollversion 3 (Standard in aktuellen Umgebungen) // - Netzwerk-Timeout, damit die Anfrage nicht unendlich hängt ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($connection, LDAP_OPT_NETWORK_TIMEOUT, $timeout); // UPN (User Principal Name) aus Benutzername und Domain-Suffix bilden. // Beispiel: "administrator" + "@ITFA-PROJ-DOM.local" -> "administrator@ITFA-PROJ-DOM.local" $bindRdn = $username . $domainSuffix; // Eigentliche Authentifizierung: // ldap_bind versucht, sich mit den angegebenen Anmeldedaten am AD/LDAP anzumelden. // Rückgabewerte: // - true -> Anmeldedaten sind gültig // - false -> Anmeldedaten sind ungültig (z. B. falsches Passwort) // // Das @-Zeichen unterdrückt PHP-Warnings, damit Fehlermeldungen nicht unformatiert im HTML landen. $bindResult = @ldap_bind($connection, $bindRdn, $password); // Verbindung zum LDAP-Server wieder schließen. ldap_unbind($connection); // Bei erfolgreichem Bind (true) -> Authentifizierung erfolgreich. // Bei false -> fachlich fehlgeschlagene Anmeldung (z. B. falsche Credentials). return $bindResult === true; } }