Исключение AuthenticationException
Исключение AuthenticationException выбрасывается
компонентом Security, когда процесс аутентификации
пользователя не может быть завершён успешно. Оно
наследуется от класса RuntimeException и
реализует интерфейс AuthenticationExceptionInterface.
Первым параметром конструктор принимает текст
сообщения об ошибке, вторым - код ошибки, третьим -
предыдущее исключение.
Чаще всего это исключение используется как базовый
класс для более конкретных исключений безопасности,
таких как BadCredentialsException, AccountExpiredException,
LockedException, DisabledException и других. Его можно
перехватить в слушателе событий безопасности или в
собственном аутентификаторе, чтобы вернуть понятный
ответ пользователю.
Синтаксис
new AuthenticationException(string $message = '', int $code = 0, ?Throwable $previous = null)
Пример
Давайте выбросим исключение AuthenticationException
внутри собственного аутентификатора:
<?php
namespace AppSecurity;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSecurityCoreExceptionAuthenticationException;
use SymfonyComponentSecurityHttpAuthenticatorAbstractAuthenticator;
use SymfonyComponentSecurityHttpAuthenticatorPassportInterface;
class CustomAuthenticator extends AbstractAuthenticator
{
public function supports(Request $request): ?bool
{
return $request->headers->has('X-AUTH-TOKEN');
}
public function authenticate(Request $request): PassportInterface
{
$token = $request->headers->get('X-AUTH-TOKEN');
if ('abcde' !== $token) {
throw new AuthenticationException('Invalid token');
}
return new SelfValidatingPassport(
new UserBadge($token)
);
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response
{
return new Response(
'Authentication failed: ' . $exception->getMessage(),
Response::HTTP_UNAUTHORIZED
);
}
}
?>
Результат выполнения кода при неверном токене:
Authentication failed: Invalid token
Пример
Давайте перехватим исключение AuthenticationException
в слушателе событий:
<?php
namespace AppEventListener;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelEventExceptionEvent;
use SymfonyComponentSecurityCoreExceptionAuthenticationException;
class AuthenticationFailureListener
{
public function onKernelException(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
if ($exception instanceof AuthenticationException) {
$response = new Response(
'Please log in again',
Response::HTTP_UNAUTHORIZED
);
$event->setResponse($response);
}
}
}
?>
Результат выполнения кода при ошибке аутентификации:
Please log in again
Смотрите также
-
исключение
AccessDeniedException,
которое выбрасывается при отказе в доступе -
исключение
AccountExpiredException,
которое выбрасывается при истечении срока учётной записи -
исключение
LockedException,
которое выбрасывается при блокировке пользователя -
исключение
CustomUserMessageAuthenticationException,
которое позволяет задать своё сообщение об ошибке