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:
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.
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.
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:
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.
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.
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.
Tags und Links php authentication symfony ldap