Symfony-Authentifizierungsanbieter

8

Ich verwende fr3d/ldap-bundle . Es meldet mich an und importiert Benutzer von AD, wenn sie nicht in db sind. Das ist gut.

Trotz AD-Benutzern habe ich auch lokale Benutzer, die sich in meiner Datenbank befinden. Es gibt eine spezielle Spalte authType , die angibt, wie der Benutzer authentifiziert werden soll - über LDAP oder nativ (FOS). Ich habe meinen eigenen Benutzeranbieter erstellt:

%Vor%

PROBLEM: Der Kettenanbieter ist keine Option - er ermöglicht dem Benutzer, sich mit seinem LDAP-Passwort UND mit seinem lokalen Passwort anzumelden! Das ist ein großes Sicherheitsproblem.

Gibt es eine Möglichkeit, Benutzer über verschiedene Authentifizierungsanbieter einzuloggen, abhängig vom Datenbankfeld?

BEARBEITEN:

Meine Sicherheit.yml:

%Vor%

Hier ist security.yml. Diese Zeile fr3d_ldap: ~ aktiviert das ldap-Bundle, das ldap-Benutzer autorisiert und sie in meine db speichert. Ohne es kann ich sie nicht autorisieren, wahrscheinlich würde ich benutzerdefinierte AuthenticationProvider schreiben müssen.

    
mmmm 09.06.2015, 13:03
quelle

4 Antworten

1

Ich bin nicht sehr vertraut mit LDAP, aber ich würde vorschlagen, versuchen Sie eine vollständig manuelle Anmeldung

%Vor%

Dann können Sie die Überprüfungen manuell durchführen und je nach Ergebnis der Prüfung entscheiden, wie Sie den Benutzer vor der Authentifizierung überprüfen möchten. Führen Sie beispielsweise eine Abfrage nach Benutzername und Kennwort aus, bevor Sie diesen Anmeldecode oder was auch immer ausführen, abhängig vom gewünschten Datenbankfeld.

    
Joe Yahchouchi 15.06.2015 06:58
quelle
0

Ihre Vorgehensweise scheint in Ordnung, aber Sie sollten die Logik Ihrer Methoden überprüfen. Vor allem dieser:

%Vor%

Sie übergeben $username als Argument an diese Methode, verwenden aber dann $user object, das im aktuellen Kontext undefiniert zu sein scheint. Zweitens:

%Vor%

So wie die Methode chooseProviderForUsername tatsächlich keinen Wert zurückgibt, ist es nicht möglich, sie so zu verketten.

Ich hoffe, dass das Refactoring dieser Probleme Ihren Provider richtig funktionieren lässt.

    
Andrey Mischenko 17.06.2015 08:31
quelle
0

Ok, also sehr kurze Antwort, aber ich denke, im Moment sucht Symfony nach dem Benutzer unter einem alten Benutzeranbieter und nicht nach dem, den Sie für diesen bestimmten Benutzer haben wollen (was die ganze Anmeldung mit zwei Passwörtern erklärt ). Eine Lösung sollte sein, AppBundleUserProvider implementieren UserProviderInterface zu machen, die anderen Benutzeranbieter von security.yml zu entfernen und dann sicherzustellen, dass die erste Sache AppBundleUserProvider es tut, um herauszufinden, welcher Benutzeranbieter für diesen Benutzer erforderlich ist, um ihn nachzuahmen für jede Methode in UserProviderInterface . Sie könnten $this->realUP basierend auf dem Benutzernamen festlegen und dann jede Methode so einstellen, dass sie nur $this->realUP->someMethod() zurückgibt.

    
Dom Weldon 17.06.2015 18:45
quelle
0

Der sauberste Weg, den ich mir vorstellen kann, ist, Ihren eigenen ChainProvider-Klasse , die nur die Anmeldung mit einem Provider und Verwenden Sie den Dependency-Injektionscontainer, um Ihren zu verwenden .

Sie müssen nur die security.user.provider.chain.clas -Parameterdefinition in der Konfigurationsdatei Ihres Bundles überschreiben.

    
mTorres 18.06.2015 08:27
quelle

Tags und Links