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

Исключение 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,
    которое позволяет задать своё сообщение об ошибке
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить