In vielen Unternehmen läuft die interne Benutzerverwaltung über Active Directory (AD). Wenn eine neue Laravel-Anwendung eingeführt wird, soll sich niemand ein weiteres Passwort merken müssen – die Mitarbeiter sollen sich mit ihrem Windows-Konto automatisch anmelden können. Genau das ist Windows Single Sign-On (SSO). In diesem Artikel zeige ich, wie man das mit Laravel 11 und dem Paket LdapRecord (genauer: LdapRecord-Laravel) umsetzt.
Was ist Windows SSO überhaupt?
Windows SSO bedeutet, dass ein Nutzer, der bereits an einer Windows-Domäne angemeldet ist, sich bei einer Webanwendung nicht erneut mit Benutzername und Passwort anmelden muss. Der Browser übergibt im Hintergrund ein Kerberos-Ticket (oder NTLM als Fallback) an den Server, der Server prüft dieses Ticket gegen den Domain Controller – und der Nutzer ist eingeloggt, ohne ein Formular auszufüllen.
Warum LdapRecord?
LdapRecord ist die aktuell gepflegteste und flexibelste LDAP-Bibliothek für PHP und bringt mit LdapRecord-Laravel eine fertige Integration mit, die sich nahtlos in Laravels Auth-System einklinkt. Im Gegensatz zu älteren Lösungen unterstützt es:
- Laravel 10 und 11 nativ
- Mehrere LDAP-Verbindungen gleichzeitig (z. B. mehrere Standorte/Domänen)
- Synchronisation von AD-Attributen in die lokale
users-Tabelle - Fallback-Authentifizierung, falls kein SSO-Ticket vorhanden ist
Schritt 1: Installation
composer require directorytree/ldaprecord-laravel
php artisan vendor:publish --tag=ldap-config
php artisan vendor:publish --tag=ldap-auth-config
php artisan vendor:publish --tag=ldap-auth-migrations
php artisan migrate
Schritt 2: LDAP-Verbindung konfigurieren
In config/ldap.php wird die Verbindung zum Domain Controller hinterlegt:
'connections' => [
'default' => [
'hosts' => ['dc01.firma.local'],
'base_dn' => 'dc=firma,dc=local',
'username' => 'cn=service-account,ou=service,dc=firma,dc=local',
'password' => env('LDAP_PASSWORD'),
'port' => 389,
'use_ssl' => false,
'use_tls' => true,
],
],
Der Service-Account benötigt nur Leserechte auf das Verzeichnis – keine administrativen Rechte.
Schritt 3: Authentifizierungs-Guard einrichten
In config/auth.php wird ein LDAP-Provider ergänzt, der bestehende Laravel-Nutzer mit AD-Konten verknüpft:
'providers' => [
'users' => [
'driver' => 'ldap',
'model' => LdapRecord\Models\ActiveDirectory\User::class,
'database' => [
'model' => App\Models\User::class,
'sync_passwords' => false,
'sync_attributes' => [
'name' => 'cn',
'email' => 'mail',
],
],
],
],
Damit meldet sich ein Benutzer weiterhin klassisch per Formular an – LdapRecord übernimmt im Hintergrund den Abgleich mit AD und legt bei Bedarf automatisch einen lokalen Datensatz an.
Schritt 4: Vom klassischen Login zu echtem SSO
Der Formular-Login allein ist noch kein SSO – dafür fehlt die automatische Erkennung des bereits angemeldeten Windows-Nutzers. Zwei gängige Wege:
Kerberos über den Webserver (empfohlen für IIS/Apache mit mod_auth_kerb)
Der Webserver übernimmt die Kerberos-Verhandlung und liefert den authentifizierten Benutzernamen im Header REMOTE_USER an PHP. In Laravel liest man diesen Header dann in einer eigenen Middleware aus und meldet den Nutzer über LdapRecord an – ganz ohne Login-Formular.
class WindowsSsoMiddleware
{
public function handle($request, Closure $next)
{
$remoteUser = $request->server('REMOTE_USER');
if ($remoteUser && !Auth::check()) {
$username = Str::after($remoteUser, '\\'); // DOMAIN\user -> user
$user = LdapRecord\Models\ActiveDirectory\User::findBy('samaccountname', $username);
if ($user) {
Auth::login(
App\Models\User::firstOrCreate(['email' => $user->mail[0]])
);
}
}
return $next($request);
}
}
NTLM als Fallback
Wenn Kerberos nicht möglich ist (z. B. bei reinem HTTP ohne Domain-Trust zwischen Client und Server), kann NTLM als Übergangslösung dienen. Das ist weniger sicher als Kerberos und sollte nur temporär eingesetzt werden.
Häufige Stolperfallen
- Service-Account-Rechte: Der LDAP-Bind-Account braucht wirklich nur Leserechte – nichts weiter.
- TLS statt Klartext:
use_tlssollte in Produktivumgebungen immer aktiv sein, damit Zugangsdaten nicht im Klartext über das Netzwerk gehen. - Zeit-Synchronisation: Kerberos reagiert empfindlich auf Zeitunterschiede zwischen Server und Domain Controller (mehr als 5 Minuten Abweichung führen zu Fehlern).
- REMOTE_USER-Header: Dieser wird nur korrekt gesetzt, wenn der Webserver selbst die Kerberos-Verhandlung übernimmt – ein reiner PHP-Prozess kann das nicht allein.
Fazit
Mit LdapRecord-Laravel lässt sich Windows SSO in Laravel 11 sauber und wartbar umsetzen, ohne auf Altlasten oder unsauber gepflegte LDAP-Pakete zurückgreifen zu müssen. Der Aufwand liegt weniger im PHP-Code als in der korrekten Konfiguration von Webserver, Kerberos und Active Directory – hier lohnt sich ein enger Austausch mit der IT-Abteilung des Kunden.
Benötigen Sie Unterstützung bei der Einrichtung von Windows SSO oder anderen LDAP-Integrationen in Ihrer Laravel- oder WordPress-Anwendung? Kontaktieren Sie mich.
