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

Метод authenticate класса AbstractAuthenticator

Метод authenticate класса AbstractAuthenticator вызывается системой безопасности Symfony, когда аутентификатор поддерживает текущий запрос. Метод получает объект Request и должен вернуть объект Passport. Внутри паспорта передаётся бейдж пользователя UserBadge, а также бейджи учётных данных, такие как PasswordCredentials или CsrfTokenBadge. Если метод вернёт null или бросит исключение AuthenticationException, аутентификация считается неуспешной.

Синтаксис

abstract public function authenticate(Request $request): Passport;

Пример

Давайте создадим аутентификатор, который читает логин и пароль из POST-запроса и возвращает паспорт с бейджем пользователя и учётными данными:

<?php namespace App\Security; use App\Repository\UserRepository; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; use Symfony\Component\Security\Http\Authenticator\Passport\Passport; use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport; class AppAuthenticator extends AbstractAuthenticator { public function __construct( private UserRepository $userRepository ) { } public function supports(Request $request): ?bool { return $request->isMethod('POST') && $request->getPathInfo() === '/login'; } public function authenticate(Request $request): Passport { $login = $request->request->get('login', ''); $password = $request->request->get('password', ''); if ($login === '' || $password === '') { throw new AuthenticationException('Empty credentials.'); } return new SelfValidatingPassport( new UserBadge($login, function (string $userIdentifier) { return $this->userRepository->findOneBy(['login' => $userIdentifier]); }) ); } public function onAuthenticationSuccess(Request $request, $token, string $firewallName): ?Response { return new RedirectResponse('/'); } public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response { return new Response('Authentication failed', Response::HTTP_UNAUTHORIZED); } } ?>

Результат выполнения кода при успешной аутентификации:

"redirect to /"

Пример

Давайте добавим проверку пароля через PasswordCredentials и бейдж CSRF-токена:

<?php namespace App\Security; use App\Repository\UserRepository; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials; use Symfony\Component\Security\Http\Authenticator\Passport\Passport; class FormAuthenticator extends AbstractAuthenticator { public function __construct( private UserRepository $userRepository ) { } public function supports(Request $request): ?bool { return $request->isMethod('POST') && $request->getPathInfo() === '/login'; } public function authenticate(Request $request): Passport { $login = $request->request->get('login', ''); $password = $request->request->get('password', ''); $csrfToken = $request->request->get('_csrf_token', ''); return new Passport( new UserBadge($login, function (string $userIdentifier) { return $this->userRepository->findOneBy(['login' => $userIdentifier]); }), new PasswordCredentials($password), [ new CsrfTokenBadge('authenticate', $csrfToken), ] ); } public function onAuthenticationSuccess(Request $request, $token, string $firewallName): ?Response { return new RedirectResponse('/'); } public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response { return new Response('Authentication failed', Response::HTTP_UNAUTHORIZED); } } ?>

Результат выполнения кода при неверном пароле:

"Authentication failed"

Смотрите также

  • класс AbstractAuthenticator,
    который является базой для пользовательских аутентификаторов
  • класс Passport,
    который хранит бейджи пользователя и учётных данных
  • бейдж UserBadge,
    который передаёт идентификатор пользователя в паспорт
  • бейдж PasswordCredentials,
    который проверяет пароль пользователя
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить