Symfony 2.8 Guard AbstractGuardAuthenticator,如何返回真正的令牌?

时间:2016-10-29 13:03:10

标签: php symfony authentication symfony-security

我在Symfony 2.8中添加的相对较新的AbstractGuardAuthenticator子系统中使用Guard

我的设置非常简单。我向受保护的URL发送请求,该URL采用用户名:密码base64编码。它会对数据库进行检查并返回令牌。

验证成功方法:

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

更新1.1:

使用LexikJWTAuthenticationBundle我现在正试图将Json Web Tokens实现到我的应用程序AbstractGuardAuthenticator中。 Lexik捆绑包提供成功和失败处理程序:lexik_jwt_authentication.handler.authentication_success& lexik_jwt_authentication.handler.authentication_failure指向将某些JWT变量注入其中的类。如何将它们挂钩到AbstractGuardAuthenticator的成功和失败处理程序中?

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

Guard成功和失败方法

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

我目前正在扩展并将JWTTokenAuthenticator与我自己的令牌身份验证器合并,而不是AbstractGuardAuthenticator,因为它们都是GuardAuthenticatorInterface

1 个答案:

答案 0 :(得分:2)

  

我想知道如何返回一个真实的令牌,可以用来验证用户,而不是每次都发送用户名:密码。

Symfony Guard组件

Guard旨在简化身份验证子系统。

在Guard之前,设置自定义身份验证的工作要多得多。您需要创建多个部件/类并使它们协同工作。它很灵活,您可以创建任何您想要的身份验证系统,但需要一些努力。使用Guard,它变得更容易,同时保持所有灵活性。

这是您正在寻找的组件。

Symfony安全令牌

当阅读有关Guard组件的文档中的“token”一词时,所指的是TokenInterface的实现。 Symfony使用这些实现来跟踪身份验证状态。这些实现永远不会离开您的应用程序,这是内部事情。

这是您正在寻找的令牌。

JSON网络令牌

您正在谈论的“令牌”是客户可用于进行身份验证的一些信息。这可以是随机字符串,如OAuth 2.0协议的“访问令牌”,也可以是自包含和签名的信息集,如JSON Web Tokens(JWT)。

IMHO JWT目前是最具前瞻性的令牌。 The Anatomy of a JSON Web Token是熟悉JWT的好读物。

有几个捆绑包可以轻松地将JWT集成到您的Symfony项目中。 LexikJWTAuthenticationBundle是目前最受欢迎的一个。我建议你看看:))