Исключение AccountExpiredException
Исключение AccountExpiredException относится к компоненту
Security и выбрасывается системой аутентификации, когда
учётная запись пользователя помечена как просроченная.
Обычно это происходит, когда поле expiresAt сущности
пользователя содержит дату в прошлом. Исключение наследуется
от AuthenticationException и приводит к отказу
в доступе при попытке входа.
Синтаксис
<?php
namespace Symfony\Component\Security\Core\Exception;
class AccountExpiredException extends AuthenticationException
{
public function getMessageKey(): string
{
return 'Account has expired.';
}
}
?>
Пример
Давайте создадим сущность пользователя с полем expiresAt
и реализуем интерфейс UserInterface с методом
isAccountNonExpired:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
#[ORM\Entity]
class User implements UserInterface
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private int $id;
#[ORM\Column(type: 'string')]
private string $username;
#[ORM\Column(type: 'datetime')]
private \DateTimeInterface $expiresAt;
public function getRoles(): array
{
return ['ROLE_USER'];
}
public function getPassword(): string
{
return '';
}
public function getSalt(): ?string
{
return null;
}
public function getUsername(): string
{
return $this->username;
}
public function eraseCredentials(): void
{
}
public function isAccountNonExpired(): bool
{
return $this->expiresAt > new \DateTime();
}
}
?>
Пример
Давайте проверим статус аккаунта в контроллере и
выбросим исключение AccountExpiredException
вручную, если срок действия истёк:
<?php
namespace App\Controller;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Core\Exception\AccountExpiredException;
class SecurityController extends AbstractController
{
#[Route('/login', name: 'app_login')]
public function login(): Response
{
$user = new User();
if (!$user->isAccountNonExpired()) {
throw new AccountExpiredException('Account has expired.');
}
return new Response('user logged in');
}
}
?>
Результат выполнения кода при истёкшем аккаунте:
AccountExpiredException: Account has expired.
Пример
Давайте обработаем исключение через слушатель событий и вернём понятное сообщение пользователю:
<?php
namespace App\EventListener;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Exception\AccountExpiredException;
class AccountExpiredListener
{
public function __construct(
private UrlGeneratorInterface $urlGenerator,
) {
}
public function onKernelException(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
if ($exception instanceof AccountExpiredException) {
$response = new RedirectResponse(
$this->urlGenerator->generate('app_login')
);
$event->setResponse($response);
}
}
}
?>
Результат выполнения кода:
"redirect to /login"
Смотрите также
-
исключение
AuthenticationException,
базовый класс для ошибок аутентификации -
исключение
LockedException,
которое выбрасывается при блокировке аккаунта -
исключение
DisabledException,
которое выбрасывается при отключённом аккаунте -
исключение
CustomUserMessageAuthenticationException,
которое позволяет задать своё сообщение об ошибке