Исключение DisabledException
Исключение DisabledException относится к компоненту
Security и выбрасывается провайдером аутентификации,
когда пользователь успешно прошёл проверку учётных данных,
но его учётная запись отключена. Это исключение
наследуется от AccountStatusException и
реализует интерфейс AuthenticationException.
Его можно перехватить в слушателе аутентификации,
чтобы вывести пользователю понятное сообщение
о том, что доступ к учётной записи заблокирован.
Синтаксис
use Symfony\Component\Security\Core\Exception\DisabledException;
throw new DisabledException('Your account is disabled.');
Пример
Давайте создадим пользователя с флагом enabled
равным false и попробуем его аутентифицировать.
Сначала опишем сущность пользователя:
<?php
namespace App\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
class User implements UserInterface
{
private string $email;
private string $password;
private bool $enabled = true;
public function getEmail(): string
{
return $this->email;
}
public function setEmail(string $email): void
{
$this->email = $email;
}
public function getPassword(): string
{
return $this->password;
}
public function setPassword(string $password): void
{
$this->password = $password;
}
public function isEnabled(): bool
{
return $this->enabled;
}
public function setEnabled(bool $enabled): void
{
$this->enabled = $enabled;
}
public function getRoles(): array
{
return ['ROLE_USER'];
}
public function getSalt(): ?string
{
return null;
}
public function getUsername(): string
{
return $this->email;
}
public function eraseCredentials(): void
{
}
}
?>
Теперь создадим контроллер, который проверяет пользователя и выбрасывает исключение, если его учётная запись отключена:
<?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\DisabledException;
class SecurityController extends AbstractController
{
#[Route('/login', name: 'security_login')]
public function login(): Response
{
$user = new User();
$user->setEmail('user@example.com');
$user->setEnabled(false);
if (!$user->isEnabled()) {
throw new DisabledException('Your account is disabled.');
}
return new Response('hello');
}
}
?>
Результат выполнения кода для отключённого пользователя:
"Your account is disabled."
Пример
Давайте перехватим исключение DisabledException
в слушателе и вернём пользователю понятный ответ:
<?php
namespace App\EventListener;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\DisabledException;
use Symfony\Component\Security\Http\Event\LoginFailureEvent;
class AuthenticationListener
{
public function onLoginFailure(LoginFailureEvent $event): void
{
$exception = $event->getException();
if ($exception instanceof DisabledException) {
$response = new Response('Account is disabled.');
$event->setResponse($response);
}
}
}
?>
Результат выполнения кода:
"Account is disabled."
Смотрите также
-
исключение
AccountExpiredException,
которое выбрасывается при истечении срока учётной записи -
исключение
LockedException,
которое выбрасывается при блокировке пользователя -
исключение
AuthenticationException,
базовое исключение для ошибок аутентификации -
исключение
CustomUserMessageAuthenticationException,
которое позволяет задать своё сообщение об ошибке