Класс AbstractLoginFormAuthenticator
Класс AbstractLoginFormAuthenticator является базовым классом для создания аутентификатора, который обрабатывает вход пользователя через обычную HTML-форму. Он расширяет класс AbstractAuthenticator и предоставляет готовую реализацию метода supports, который определяет, должен ли аутентификатор обрабатывать текущий запрос. Наследнику достаточно реализовать метод authenticate для проверки учётных данных и метод getLoginUrl для перенаправления неаутентифицированных пользователей на страницу входа.
Синтаксис
abstract class AbstractLoginFormAuthenticator extends AbstractAuthenticator
{
abstract protected function getLoginUrl(): string;
public function supports(Request $request): ?bool;
abstract public function authenticate(Request $request): Passport;
}
Пример
Давайте создадим простой аутентификатор, который принимает логин и пароль из POST-запроса и возвращает паспорт с UserBadge и PasswordCredentials:
<?php
namespace AppSecurity;
use AppRepositoryUserRepository;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingGeneratorUrlGeneratorInterface;
use SymfonyComponentSecurityHttpAuthenticatorAbstractLoginFormAuthenticator;
use SymfonyComponentSecurityHttpAuthenticatorPassportBadgeUserBadge;
use SymfonyComponentSecurityHttpAuthenticatorPassportCredentialsPasswordCredentials;
use SymfonyComponentSecurityHttpAuthenticatorPassportPassport;
use SymfonyComponentSecurityHttpAuthenticatorTokenTokenInterface;
use SymfonyComponentSecurityHttpSecurity;
class LoginFormAuthenticator extends AbstractLoginFormAuthenticator
{
public function __construct(
private UserRepository $userRepository,
private UrlGeneratorInterface $urlGenerator
) {
}
protected function getLoginUrl(): string
{
return $this->urlGenerator->generate('app_login');
}
public function authenticate(Request $request): Passport
{
$username = $request->request->get('username', '');
$password = $request->request->get('password', '');
return new Passport(
new UserBadge($username, fn (string $userIdentifier) => $this->userRepository->findOneBy(['username' => $userIdentifier])),
new PasswordCredentials($password)
);
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
{
return new Response('"hello"');
}
}
?>
В этом примере метод authenticate извлекает поля username и password из POST-запроса, создаёт объект UserBadge с загрузчиком пользователя и объект PasswordCredentials с паролем. Метод getLoginUrl возвращает адрес страницы входа.
Пример
Давайте зарегистрируем аутентификатор в конфигурации безопасности:
security:
firewalls:
main:
lazy: true
provider: app_user_provider
custom_authenticator:
authenticators:
- AppSecurityLoginFormAuthenticator
logout:
path: app_logout
После регистрации Symfony автоматически вызовет метод supports, унаследованный от AbstractLoginFormAuthenticator. Этот метод проверяет, что текущий запрос является POST-запросом на адрес, возвращаемый методом getLoginUrl.
Смотрите также
-
класс
AbstractAuthenticator,
который является базовым для всех аутентификаторов -
метод
getLoginUrl,
который возвращает адрес страницы входа -
метод
authenticate,
который проверяет учётные данные пользователя -
класс
Passport,
который хранит бейджи и учётные данные