Метод 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,
который проверяет пароль пользователя