Symfony2: Verwenden Sie sowohl LDAP (Active Directory) als auch DB für die Benutzerauthentifizierung

8

Ich verwende das Symfony-Framework v 2.4.2 , um eine bestehende Website zu aktualisieren, die eine doppelte Überprüfung zum Anmelden von Benutzern durchführt:

  1. Zuerst prüft es, ob der Benutzername und das Passwort zu einem gültigen Active Directory-Benutzer gehören (unter Verwendung der PHP-Funktion ldap_bind() );
  2. Wenn ja, wird nur der Benutzername für eine DB-Tabelle überprüft ( kein Kennwort wird in der DB gespeichert);
  3. Wenn der Benutzername in der DB-Tabelle gefunden wird, lädt die Website das Benutzerprofil aus der Datenbank und der Benutzer wird authentifiziert.

Wie kann ich diesen Auth-Prozess in Symfony2 replizieren?

Bisher bin ich bei FOSUserBundle und FR3DLdapBundle stecken geblieben: Ich habe es geschafft, verkettete Provider zu verwenden ( ldap und db ), aber anscheinend werden LDAP-Anmeldeinformationen vollständig ignoriert : Benutzer können sich mit den in der Datenbank gespeicherten Anmeldeinformationen anmelden, selbst wenn ldap_bind() fehlschlägt - was genau das genaue Gegenteil der Punkte ist 1 & amp; 2.

Außerdem scheint es bei der Verwendung von FOSUserBundle notwendig, Passwörter in der Datenbank zu speichern.

Bitte beachten Sie Punkt Nr. 2: Benutzern steht es frei, ihr LDAP-Passwort von außerhalb der Website (also von Active Directory) zu ändern und sich dann mit den neuen Anmeldeinformationen anzumelden - ohne die Benutzerdatenbank der Website zu aktualisieren.

Jede Lösung ist willkommen, ich bin nicht so sehr in FOSUserBundle und noch weniger in FR3DLdapBundle verliebt.

    
Paolo Stefan 19.03.2014, 09:20
quelle

2 Antworten

4

Ich habe es so ausgearbeitet:

  1. hat eine benutzerdefinierte Benutzereinheit basierend auf dem FOSUSerBundle-Benutzermodell erstellt;
  2. hat einen benutzerdefinierten Benutzerprovider erstellt (siehe Javad Antwort auf diese Frage), registriert ihn als Dienst und fügte ihn meinem providers -Abschnitt in app/config/security.yml ;
  3. hinzu
  4. Ab Version 2.4 bietet Symfony (zum Glück) ein vereinfachtes Authentifizierungssystem an, das Sie nicht dazu zwingt, den gesamten Code des Authentifizierungsanbieters zu durchsuchen (was für IMHO wirklich ein Problem war): er heißt Authenticator und es ist hier dokumentiert. Ich habe meine eigene Authenticator-Klasse implementiert und die doppelte Prüfung mit meiner benutzerdefinierten UserProvider-Klasse durchgeführt.
Paolo Stefan 24.03.2014, 11:29
quelle
3

Sie müssen einen CustomUserProvider für LDAP definieren, der den Benutzer in AD findet und in Ihrer security.yml müssen Sie diesen Provider einstellen ( Benutzerdefinierter Benutzeranbieter )

%Vor%

Sie müssen Ihren Dienst auch in Ihrer Firewall aktivieren Im nächsten Schritt erstellen Sie einen benutzerdefinierten Authentifizierungsanbieter für LDAP, der den Benutzer und das Kennwort über LDAP authentifiziert und das Benutzerobjekt aus der DB zurückgibt ( Benutzerdefinierter Authentifizierungsanbieter )

Als Grundlage für diesen Prozess wird zuerst versucht, einen Benutzer in LDAP zu finden, wenn er existiert, wird die Authentifizierung über LDAP fortgesetzt und wenn der Benutzer authentifiziert wird, wird das Benutzerobjekt von der DB zurückgegeben.

Hier ist ein Beispiel für einen benutzerdefinierten Benutzeranbieter

%Vor%

Ich nehme an, Sie haben die adLDAP-Klasse, um Benutzer über LDAP zu authentifizieren

    
Javad 19.03.2014 15:46
quelle