Automatisch nach der Registrierung ist der Benutzer-Authentifizierung
Bauen wir eine business-app von Grund auf in Symfony 2 und ich habe ein bisschen ein Problem mit der Benutzer-Registrierung flow: nachdem der Benutzer ein Konto erstellt, dann werden Sie automatisch eingeloggt mit den Anmeldeinformationen, anstatt sofort gezwungen, Ihre Anmeldeinformationen erneut eingeben.
Jemand schon Erfahrung mit dieser, oder in der Lage, zeigen Sie mich in die richtige Richtung?
InformationsquelleAutor Problematic | 2011-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Symfony 4.0
Dieser Prozess nicht geändert von symfony 3, 4, aber hier ist ein Beispiel mit dem neu empfohlen AbstractController. Sowohl die
security.token_storage
und diesession
services registriert sind, in das übergeordnetegetSubscribedServices
Methode, so dass Sie nicht haben, fügen Sie Sie in Ihre controller.Symfony 2.6.x - Symfony 3.0.x
Als von symfony 2.6
security.context
ist veraltet, zu Gunsten dersecurity.token_storage
. Der controller kann nun einfach sein:Dies ist zwar veraltet, können Sie immer noch
security.context
wie es gemacht worden ist abwärtskompatibel. Nur bereit sein, Sie zu aktualisieren, für Symfony 3Lesen Sie mehr über die 2.6 änderungen für Sicherheits-hier: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x
Zu diesem Zweck in symfony 2.3 Sie können nicht mehr einfach den token in den security-Kontext. Sie müssen auch speichern Sie das token an die Sitzung.
Vorausgesetzt eine security-Datei mit einer firewall wie:
Und eine controller-Aktion, die ähnlich zu:
Für die token-Erstellung Sie möchten, erstellen Sie eine
UsernamePasswordToken
Dies akzeptiert 4 Parameter: User-Entität, die Benutzer-Anmeldeinformationen, Firewall-Name, Benutzer-Rollen. Sie nicht brauchen, um die Benutzer-Anmeldeinformationen für das token gültig ist.Ich bin nicht 100% sicher, dass das token auf die
security.context
ist notwendig, wenn Sie sich nur noch die Umleitung sofort. Aber es scheint nicht zu verletzen, so habe ich es gelassen.Dann der wichtige Teil, die Einstellung der session-variable. Die Variablen Namenskonvention ist
_security_
gefolgt von Ihrer firewall-name, in diesem Fallmain
machen_security_main
Verrückte Dinge geschahen ohne
$this->get('session')->set('_security_main', serialize($token));
. Danke, @Chausser!Mit Symfony 2.6 wenn Sie die token für eine firewall namens
main
UND man authentifiziert sich mit einer anderen firewall namensadmin
(wie Sie die Identität der Nutzer), eine seltsame Sache passiert:_security_admin
bekommt dieUsernamePasswordToken
mit der Benutzer, den Sie zur Verfügung gestellt, d.h. Sie Holen Sie sich "getrennt" von Ihremadmin
firewall. Keine Ahnung, wie zur Aufrechterhaltung der token für die "admin" - firewall?Um ehrlich zu sein, ich bin nicht sicher, der Sie authentifiziert werden können, für 2 firewalls gleichzeitig krank Aussehen in es, aber in der Zwischenzeit sollten Sie Fragen zu einer separaten Frage
verwaltet, damit es funktioniert. Sie sind Antwort ist völlig richtig (und aktualisiert), die einzige Sache, die es nur funktioniert, wenn Sie anrufen
setToken(..)
unter der gleichen Ziel-firewall oder ohne authentifiziert werden noch.InformationsquelleAutor Chase
Dieses herausgefunden, endlich.
Nach Benutzer-Registrierung, sollten Sie haben Zugriff auf ein Objekt instanceof-was auch immer Sie sich gesetzt haben, als Sie Ihre Benutzer-Entität in Ihrem provider-Konfiguration. Die Lösung ist, erstellen Sie ein neues token mit, dass die Entität "Benutzer" und geben es in den security-Kontext. Hier ist ein Beispiel, basierend auf meinen setup:
RegistrationController.php:
Wo
main
ist der name der firewall, die für Ihre Anwendung (danke an @Joe). Das ist wirklich alles dort ist zu ihm; das system hält Ihre user vollständig angemeldet als der Benutzer an, die Sie gerade erstellt haben.EDIT: Pro @Miquel ' s Kommentar, ich habe aktualisiert die controller-code Beispiel zum einbinden einer sinnvollen default-Rolle für den neuen Benutzer (obwohl dies kann selbstverständlich angepasst werden, entsprechend Ihrer Anwendung an die spezifischen Bedürfnisse).
Was ist mit "Remember me" - Flagge? Wie login Benutzer von hand, aber auch Sie sollten angemeldet sein, für immer. Dieses Stück code löst nicht das Problem.
das war nicht im Rahmen meiner ursprünglichen Anforderungen, aber klingt wie eine große followup Antwort. Lassen Sie uns wissen, was Sie mit kommen.
Ich habe ein Problem. Ich kann protokolliert, auf diese Weise, aber ich die app.Benutzer-variable leer ist. Weißt du, jeder Weg, um füllen Sie diese variable in diesem login-Prozess? - Ich schicke die user (string) und das Passwort (string) sagen Sie den Verweis: api.symfony.com/2.0/Symfony/Component/Security/Core/...
Wie Marc gesagt, Sie müssen sich registrieren, die UsernamePasswordToken namespace:
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
InformationsquelleAutor Problematic
Wenn Sie ein Benutzeroberflächen-Objekt (und das sollte der Fall sein, die meisten der Zeit), möchten Sie vielleicht die Verwendung der getRoles-Funktion, die für das Letzte argument.
Also, wenn Sie eine Funktion erstellen logUser, sollte es so Aussehen:
InformationsquelleAutor Cédric Nirousset
Ich bin mit Symfony 2.2 und meine Erfahrung war etwas anders als Problematisch ist, so ist dies eine kombinierte version der all die Informationen aus dieser Frage, sowie einige meiner eigenen.
Ich denke Joe falsch ist sich über den Wert des
$providerKey
, den Dritten parameter, um dieUsernamePasswordToken
Konstruktor. Es soll der Schlüssel sein, der eine Authentifizierung (nicht Benutzer) Anbieter. Es ist verwendet durch die Authentifizierungs-system zu unterscheiden zwischen dem Token erstellt für verschiedene Anbieter. Alle Anbieter, die stammt ausUserAuthenticationProvider
beglaubigen nur tokens, deren provider-Taste entspricht seiner eigenen. Zum Beispiel, dieUsernamePasswordFormAuthenticationlistener
legt die Schlüssel des Tokens es erstellt zu entsprechen, die der entsprechendenDaoAuthenticationProvider
. Ermöglicht, dass eine einzelne firewall haben mehrere Benutzernamen+Passwort, Anbieter-ohne Sie treten auf einander. Deshalb müssen wir wählen einen Schlüssel, der nicht in Konflikt mit anderen Anbietern. Ich benutze'new_user'
.Habe ich ein paar Systeme in andere Teile meiner Anwendung, die abhängig von der die Authentifizierung Erfolg event, und das ist nicht gefeuert, indem Sie nur die Einstellung der token auf den Kontext an. Ich hatte die
EventDispatcher
aus dem container und Feuer das Ereignis manuell. Ich entschied mich gegen auch das auslösen eines interaktive login-Ereignis, da wir die Authentifizierung der Benutzer implizit, nicht als Reaktion auf eine explizite Anmeldung.Beachten Sie, dass die Verwendung von
$this->get( .. )
übernimmt das snippet wird in einer controller-Methode. Wenn Sie den code irgendwo sonst, Sie haben Sie zu ändern, diese zu nennenContainerInterface::get( ... )
in einer Weise angemessen für die Umwelt. Wie es passiert, meine Benutzer-Entitäten implementierenUserInterface
so kann ich diese direkt mit dem token. Wenn deins nicht, du musst einen Weg finden, um Sie zu konvertierenUserInterface
Instanzen.Dass der code funktioniert, aber ich fühle mich wie es ' s hacking rund um Symfony-Authentifizierung Architektur, anstatt zu arbeiten. Es wäre wahrscheinlich richtiger zu implementieren Sie einen neuen Authentifizierungsanbieter mit seinem eigenen token-Klasse eher als Entführung des
UsernamePasswordToken
. Auch, mit einem geeigneten Anbieter würde bedeuten, dass die Ereignisse waren für Sie verarbeitet.InformationsquelleAutor Sam Hanes
In den Fall, jemand hat die gleichen Folgen-auf die Frage, was hielt mich zurück kommen, um hier:
Aufrufen
nur Effekte, die der aktuelle
security.context
für die route verwendet.I. e. Sie können sich nur anmelden, in die ein Benutzer von einer url in der firewall-Steuerung.
(Fügen Sie eine Ausnahme für die route falls nötig -
IS_AUTHENTICATED_ANONYMOUSLY
)InformationsquelleAutor daemonl
Als Problematisch ist hier bereits erwähnt, ist dieser schwer fassbaren $providerKey parameter ist in Wirklichkeit nichts mehr als den Namen Ihrer firewall-Regel, 'foobar' in dem Fall des Beispiels unten.
blablabla
als Dritten parameter UsernamePasswordToken es funktioniert auch? was dieser parameter bedeutet?Dieser parameter bindet Ihre token, um eine spezifische firewall-Anbieter. In den meisten Fällen haben Sie nur einen Anbieter, also nicht darum kümmern.
InformationsquelleAutor Nim
Ich habe versucht, alle Antworten hier und keiner arbeitete. Nur so konnte ich meine Benutzer authentifizieren auf einem controller ist durch einen subrequest und dann umleiten. Hier ist mein code, ich bin mit silex, aber Sie können leicht anpassen, es zu symfony2:
InformationsquelleAutor Diego Castro
Auf Symfony-version 2.8.11 (wahrscheinlich arbeiten zur älteren und neueren Versionen), wenn Sie FOSUserBundle einfach, dies zu tun :
Keine Notwendigkeit zum Versand der Fall, wie ich gesehen habe, die in anderen Lösungen.
inpired von FOS\UserBundle\Controller\RegistrationController::authenticateUser
(vom Komponisten.json FOSUserBundle version : "friendsofsymfony/Benutzer-bundle": "~1.3")
InformationsquelleAutor Nico