Я играю с AbstractGuardAuthenticator
из относительно новой подсистемы Guard
, добавленной в Symfony 2.8.
Моя установка очень проста. Я отправляю запрос на защищенный 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 в 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
.