Mein Symfony2-Authentifizierungsanbieter jetzt appears to be working.Der Symfony2-Entitätsbenutzeranbieter überschreibt den benutzerdefinierten Authentifizierungsanbieter.
Nutzer Anbieter
habe ich fast die FOSUserBundle aber ich E-Mail-Adressen für meine Nutzer haben nicht einmal und ich habe nicht die zusätzliche Funktionalität oder Komplikation müssen.
Also stattdessen verwende ich nur die entity provider.
Ich setze meinen Encoder auf Klartext, weil die API-Client-Bibliothek das für mich behandelt, aber leider, ein weiterer Haken: es scheint wie Benutzer werden jetzt gegen diese Benutzerdatensätze authentifiziert.
Bevor ich den Entity User Provider implementiert habe, gab mein Login-Formular mir gültige Antworten: korrekte Credentials ergaben keinen Fehler, schlechte Credentials resultierten in meinem benutzerdefinierten "incorrect user/pass error".
Nun, auch wenn ich Credentials angeben, die ich weiß, um richtig zu sein, bekomme ich nur die Fehlermeldung "Bad credentials," as if I'm implementing the UserAuthenticationProvider, aber nach meinem besten Wissen, bin ich nicht. Mein benutzerdefinierter Anbieter directly implements the AuthenticationProviderInterface.
Also im Moment nehme ich an, dass ich den Entity User Provider falsch implementiert habe, so dass es irgendwie meinen benutzerdefinierten Authentifizierungsanbieter außer Kraft setzt. Wie können Sie den Entitätsbenutzeranbieter und einen benutzerdefinierten Authentifizierungsanbieter gleichzeitig korrekt konfigurieren?
Dateien
- /app/config/security.yml
- /src/WordRot/PlayBundle/Security/Authentication/Provider/WordnikProvider.php
Relevante Abschnittsecurity.yml
encoders:
WordRot\PlayBundle\Entity\User: plaintext
providers:
wordnik_users:
entity: { class: WordRotPlayBundle:User, property: username }
firewalls:
wordnik_secured:
pattern: ^/play
logout: ~
anonymous: ~
# The next line specifies the custom authentication provider:
wordnik: true
form_login:
provider: wordnik_users
login_path: /login
check_path: /play_check
# on success
always_use_default_target_path: true
default_target_path: /play
EDIT
This might prove useful. Es ist ein diff auf dem Master-Zweig ...
- Von wenn der benutzerdefinierten Auth-Provider (WordnikProvider) wurde noch ausgeführt (a473d354)
- Um die jüngsten auf dem Master-Zweig commit (ddcfeae2) , wo der Auth-Provider nicht mehr ausgeführt wird.
EDIT 2
Mit mehr Bruchstellen entdeckte ich:
- Auf Login-Formular POST wird WordnikProvider#supports mit einem UsernamePasswordToken, so genannt zu werden
false
zurück. - Auf Login-Formular POST,
WordnikListener
ist konstruiert, aber es sind andere Methoden (attemptAuthentication
,requiresAuthentication
) werden nie aufgerufen. Und doch wirdWordnikFactory#createListener
auch nie aufgerufen! Es ist ein Wunder, dass der Zuhörer konstruiert ist. - Jedoch auf
login_check
GET,WordnikListener#requiresAuthentication
heißt.
Der form_login Service ziemlich vorausgesetzt, dass Sie ein Passwort benötigen. Machen Sie sich also einen Encoder, der sagt, dass kein Passwort in Ordnung ist. Das sollte dich einen Schritt weiter bringen. – Cerad
Cerad, eigentlich scheint es, dass das Problem vom UserAuthenticationProvider kommt, als die "Bad credentials." Fehler schlägt vor. Obwohl es für mich ein Rätsel ist, warum dieser Anbieter geladen wird! Ich glaube nicht, dass der Encoder das Problem ist. –
Der AuthProvider lädt einen Benutzer über den Benutzerprovider und authentifiziert den Benutzer dann, indem er das Passwort mit dem Encoder überprüft. Wenn Sie den Dienst form_login überhaupt nicht verwenden, nehmen Sie ihn heraus. Aber es sieht so aus, als ob/play_check vom Standard-Auth-Handler gehandhabt wird. – Cerad