2016-10-29 3 views
0

Ich spiele mit AbstractGuardAuthenticator aus dem relativ neuen Guard Subsystem in Symfony 2.8.Symfony 2.8 Guard AbstractGuardAuthenticator, wie wird ein echtes Token zurückgegeben?

Mein Setup ist wirklich einfach. Ich sende eine Anfrage an eine geschützte URL, die einen Benutzernamen verwendet: Passwort base64 codiert. Es prüft beide gegen die Datenbank und sollte ein Token zurückgeben.

Die Authentifizierung erfolgreich Methode:

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) 
    { 
     //If login successful, return token 
     return new Response($this->tokenStorage->getToken());   
    } 

Was es gibt ist:

PostAuthenticationGuardToken(user="test", authenticated=true, roles="ROLE_ADVANCED, 
ROLE_USER") 

Nun ist es das, was ich gegeben erwarten würde, dass die AbstractGuardAuthenticator die Methode definiert dieses Token genau für das Erstellen wie Dies.

public function createAuthenticatedToken(UserInterface $user, $providerKey) 
    { 
     return new PostAuthenticationGuardToken(
      $user, 
      $providerKey, 
      $user->getRoles() 
     ); 
    } 

UPDATE 1.1:

die LexikJWTAuthenticationBundle ich jetzt versuchen, verwende Json Web Tokens in meiner Anwendung AbstractGuardAuthenticator zu implementieren. Das Lexik-Paket bietet sowohl einen Erfolgs- als auch einen Fehlerhandler: lexik_jwt_authentication.handler.authentication_success & lexik_jwt_authentication.handler.authentication_failure die auf Klassen verweisen, die bestimmte JWT-Variablen in sie injizieren. Wie hakt ich sie in AbstractGuardAuthenticator 's Erfolg und Fehler Handler?

crud: 
     anonymous: ~ 
     guard: 
      authenticators: 
       - app.token_authenticator 
     pattern: ^/database/ 

Und die Guard Erfolg und Misserfolg Methoden

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) 
{ 
    if ($token = $request->headers->get('X-AUTH-TOKEN')) { 
     //on success, let the request continue 
    } else { 
     //If login successful, return token 
     return new Response($this->tokenStorage->getToken()); 
    } 
} 

public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
{ 
    $data = array(
     'message' => strtr($exception->getMessageKey(), $exception->getMessageData()) 

     // or to translate this message 
     // $this->translator->trans($exception->getMessageKey(), $exception->getMessageData()) 
    ); 

    return new JsonResponse($data, 403); 
} 

ich zur Zeit erstreckt und JWTTokenAuthenticator mit meiner eigenen Token Authenticator anstelle der AbstractGuardAuthenticator als beide implementieren GuardAuthenticatorInterface verschmelzen.

Antwort

2

Ich möchte wissen, wie man ein echtes Token zurückgibt, mit dem ein Benutzer authentifiziert werden kann, anstatt jedesmal den Benutzernamen: password zu senden.

Symfony-Schutz-Komponente

Schutz zielt darauf ab, die Authentifizierung Subsystem vereinfacht wird.

Vor Guard war die Einrichtung der benutzerdefinierten Authentifizierung viel mehr Arbeit. Sie mussten mehrere Teile/Klassen erstellen und zusammen arbeiten lassen. Es ist flexibel, Sie können jedes gewünschte Authentifizierungssystem erstellen, aber es erfordert einige Anstrengungen. Mit Guard wird es viel einfacher, während alle Flexibilität beibehalten wird.

Dies ist nicht die Komponente, die Sie suchen.

Symfony Security Token

Wenn das Wort "Token" in der Dokumentation über die Komponente Guard Lesen, was bezeichnet ist, ist eine Implementierung des TokenInterface. Symfony verwendet diese Implementierungen, um den Authentifizierungsstatus zu verfolgen. Diese Implementierungen verlassen Ihre Anwendung nie, es ist eine interne Sache.

Dies ist nicht das Token, das Sie suchen.

JSON Web Token

Die "Token" Sie sprechen einige Pease von Informationen, die ein Client zur Authentifizierung mit nutzen können. Dies kann eine zufällige Zeichenfolge wie das "Zugriffstoken" des Protokolls OAuth 2.0 oder ein eigenständiger und signierter Satz von Informationen sein, wie JSON Web Tokens (JWT).

IMHO JWT wäre derzeit das zukunftsfähigste Token. The Anatomy of a JSON Web Token ist eine gute Lektüre, um sich mit JWT vertraut zu machen.

Es gibt mehrere Pakete, die JWT problemlos in Ihr Symfony-Projekt integrieren können. LexikJWTAuthenticationBundle ist derzeit die beliebteste. Ich schlage vor, Sie haben einen Blick :)

+0

Danke Jasper, ich werde jetzt lesen und ich werde zu Ihnen so schnell wie möglich zurück. Da das 'GuardTokenInterface' nur das' TokenInterface' implementiert, war ich ziemlich verwirrt, was ich damit machen sollte. –

+0

Ich habe schon eine Weile mit dem LexikJWTAuthenticationBundle herumgespielt und ich denke, dass das meiste davon jetzt funktioniert, aber ich bin verwirrt darüber, wie ich dies in meinem 'AbstractGuardAuthenticator' implementiere, da die Dokumentation vorschlägt, diese Authentifizierungshandler über zu injizieren ein 'form_login' welches ich nicht benutze. Ich werde meine Frage mit den Konfigurationsdetails aktualisieren. –

Verwandte Themen