Метод onAuthenticationSuccess
Метод onAuthenticationSuccess класса AbstractAuthenticator
вызывается в том случае, когда аутентификация
пользователя прошла успешно. Первым параметром
передаётся объект Request текущего запроса,
вторым - объект Passport с данными
аутентификации, третьим - имя файрвола,
в рамках которого выполняется вход.
Метод должен вернуть объект Response,
который будет отправлен клиенту вместо
стандартного перенаправления. Это позволяет
задать собственный маршрут после входа,
вернуть JSON-ответ для API или записать
данные в сессию.
Синтаксис
abstract public function onAuthenticationSuccess(
Request $request,
Passport $passport,
string $firewallName
): ?Response
Пример
Давайте создадим аутентификатор, который после успешного входа перенаправляет пользователя на страницу личного кабинета:
<?php
namespace AppSecurity;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSecurityCoreAuthenticationTokenTokenInterface;
use SymfonyComponentSecurityHttpAuthenticatorAbstractAuthenticator;
use SymfonyComponentSecurityHttpAuthenticatorPassportPassport;
use SymfonyComponentSecurityHttpAuthenticatorPassportSelfValidatingPassport;
use SymfonyComponentSecurityHttpAuthenticatorPassportBadgeUserBadge;
class AppAuthenticator extends AbstractAuthenticator
{
public function supports(Request $request): ?bool
{
return $request->getPathInfo() === '/login';
}
public function authenticate(Request $request): Passport
{
$login = $request->request->get('login');
return new SelfValidatingPassport(
new UserBadge($login)
);
}
public function onAuthenticationSuccess(
Request $request,
Passport $passport,
string $firewallName
): ?Response {
return new RedirectResponse('/account');
}
}
?>
После успешного входа браузер получит ответ
с редиректом на адрес /account.
Пример
Давайте для API-аутентификатора вернём JSON с токеном вместо редиректа:
<?php
namespace AppSecurity;
use SymfonyComponentHttpFoundationJsonResponse;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSecurityHttpAuthenticatorAbstractAuthenticator;
use SymfonyComponentSecurityHttpAuthenticatorPassportPassport;
use SymfonyComponentSecurityHttpAuthenticatorPassportSelfValidatingPassport;
use SymfonyComponentSecurityHttpAuthenticatorPassportBadgeUserBadge;
class ApiAuthenticator extends AbstractAuthenticator
{
public function supports(Request $request): ?bool
{
return $request->getPathInfo() === '/api/login';
}
public function authenticate(Request $request): Passport
{
$login = $request->request->get('login');
return new SelfValidatingPassport(
new UserBadge($login)
);
}
public function onAuthenticationSuccess(
Request $request,
Passport $passport,
string $firewallName
): ?Response {
return new JsonResponse([
'status' => 'ok',
'user' => $passport->getUser()->getUserIdentifier()
]);
}
}
?>
Результат выполнения кода для пользователя
'user':
{"status": "ok", "user": "user"}
Пример
Давайте сохраним в сессию момент последнего входа пользователя перед возвратом ответа:
<?php
namespace AppSecurity;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSecurityHttpAuthenticatorAbstractAuthenticator;
use SymfonyComponentSecurityHttpAuthenticatorPassportPassport;
use SymfonyComponentSecurityHttpAuthenticatorPassportSelfValidatingPassport;
use SymfonyComponentSecurityHttpAuthenticatorPassportBadgeUserBadge;
class SessionAuthenticator extends AbstractAuthenticator
{
public function supports(Request $request): ?bool
{
return $request->getPathInfo() === '/login';
}
public function authenticate(Request $request): Passport
{
$login = $request->request->get('login');
return new SelfValidatingPassport(
new UserBadge($login)
);
}
public function onAuthenticationSuccess(
Request $request,
Passport $passport,
string $firewallName
): ?Response {
$request->getSession()->set('login_at', date('Y-m-d H:i:s'));
return new RedirectResponse('/');
}
}
?>
Теперь в сессии будет храниться время последнего успешного входа пользователя.
Смотрите также
-
класс
AbstractAuthenticator,
который является базой для аутентификаторов -
метод
authenticate,
который выполняет проверку учётных данных -
метод
onAuthenticationFailure,
который вызывается при неудачном входе -
класс
Passport,
который передаётся в метод аутентификации