我在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
。
答案 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是目前最受欢迎的一个。我建议你看看:))