2016-10-29 17 views
0

symfony 2.8で比較的新しいGuardサブシステムのAbstractGuardAuthenticatorで遊んでいます。Symfony 2.8 Guard AbstractGuardAuthenticator、本当のトークンを返す方法は?

私の設定は本当に簡単です。私は保護されたURLに要求を送信します。パスワードはbase64で暗号化されたusername:passwordです。データベースとの両方をチェックし、トークンを返す必要があります。

認証に成功する方法:

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

それは何を返すことです:

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

に、これは私がAbstractGuardAuthenticatorはまったく同じこのトークンを作成するための方法を定義していることを与えられた期待するものですこの。

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

UPDATE 1.1:

私は今、自分のアプリケーションのAbstractGuardAuthenticatorにJSONウェブトークンを実装しようとしていますLexikJWTAuthenticationBundleを使用します。 Lexikバンドルは成功と失敗のハンドラの両方を提供します:lexik_jwt_authentication.handler.authentication_success & lexik_jwt_authentication.handler.authentication_failure特定のJWT変数を注入するクラスを指します。どうすればAbstractGuardAuthenticatorの成功と失敗のハンドラにそれらをフックできますか?

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

そして私は現在、拡張し、私自身のトークン認証システムの代わりに、両方 GuardAuthenticatorInterfaceを実装するなど AbstractGuardAuthenticatorJWTTokenAuthenticatorをマージしています

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); 
} 

Guard成功と失敗の方法。

答えて

2

毎回ユーザー名:パスワードを送信するのではなく、ユーザーを認証するために使用できる実際のトークンを返す方法を知りたいと思います。

symfonyのガードコンポーネント

Guardは認証サブシステムを簡素化することを目指しています。

Guardの前にカスタム認証を設定することは、はるかに多くの作業でした。あなたはいくつかの部品/クラスを作り、それを一緒に働かせる必要がありました。柔軟性があり、必要な認証システムを作成できますが、多少の努力が必要です。ガードを使用すると、すべての柔軟性を維持しながら、非常に簡単になります。

これはではありません。あなたが探しているコンポーネントです。

はsymfonyのセキュリティトークンは

呼ば何警備隊コンポーネントに関するドキュメントの「トークン」という言葉を読みにTokenInterfaceの実装です。 symfonyはこれらの実装を使用して認証状態を追跡します。これらの実装は決してあなたのアプリケーションを離れません。それは内部的なものです。

これはではなく、あなたが探しているトークンです。

JSONウェブトークン

「トークン」、あなたが話しているが、クライアントが使用して認証するために使用できる情報の一部ピーズです。これは、OAuth 2.0プロトコルの「アクセストークン」のようなランダムな文字列、またはJSON Web Tokens(JWT)のような自己完結かつ署名された情報のセットです。

IMHO JWTは現時点で最も将来的に証明されるトークンになります。 The Anatomy of a JSON Web TokenはJWTに精通している方には良い読書です。

SymfonyプロジェクトにJWTを簡単に統合できるバンドルがいくつかあります。 LexikJWTAuthenticationBundleが現在最も人気のあるものです。私はあなたが見ていることをお勧めします:)

+0

おかげでジャスパー、私は今それを読むつもりですそして私はできるだけ早くあなたに戻ってきます。 'GuardTokenInterface'は' TokenInterface'だけを実装しているので、私はそれらと何をするのかかなり混乱していました。 –

+0

私はLexikJWTAuthenticationBundleをしばらく使いこなしていましたが、今ではそのほとんどが動作していると思いますが、私の 'AbstractGuardAuthenticator'でこれを実装する方法を混乱させています。ドキュメントでは、これらの認証ハンドラを私が使用しない 'form_login'。質問の内容を設定の詳細で更新します。 –

関連する問題