РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
602 of 1361 menu

Метод 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,
    который передаётся в метод аутентификации
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить