Исключение AccessDeniedException
Исключение AccessDeniedException выбрасывается,
когда пользователь не имеет прав на выполнение
определённого действия или доступ к защищённому
ресурсу. Оно входит в состав компонента
Symfony\Component\Security\Core\Exception
и является частью системы безопасности Symfony.
Чаще всего это исключение возникает при проверке
прав через denyAccessUnlessGranted,
isGranted или при срабатывании voter.
Первым параметром конструктор принимает текст
сообщения об ошибке. Вторым - предыдущее
исключение. Внутри хранится объект
TokenInterface, если исключение было
создано в контексте аутентификации.
Синтаксис
new AccessDeniedException(string $message = '', ?Throwable $previous = null)
Пример
Давайте выбросим исключение AccessDeniedException
в контроллере, если пользователь не авторизован:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
if (!$this->getUser()) {
throw new AccessDeniedException('Access denied for guest user.');
}
return new Response('hello');
}
}
?>
Результат выполнения кода при обращении неавторизованного пользователя:
"Access denied for guest user."
Пример
Давайте воспользуемся методом
denyAccessUnlessGranted, который
автоматически выбрасывает
AccessDeniedException при отсутствии прав:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/edit', name: 'article_edit')]
public function edit(): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
return new Response('article');
}
}
?>
Результат выполнения кода для пользователя без роли ROLE_ADMIN:
"Access Denied."
Пример
Давайте перехватим исключение
AccessDeniedException и вернём
собственный ответ:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class ArticleController extends AbstractController
{
#[Route('/article/secure', name: 'article_secure')]
public function secure(): Response
{
try {
$this->denyAccessUnlessGranted('ROLE_USER');
} catch (AccessDeniedException $e) {
return new Response($e->getMessage());
}
return new Response('hello');
}
}
?>
Результат выполнения кода при отказе в доступе:
"Access Denied."
Смотрите также
-
исключение
HttpException,
которое является базовым для HTTP-исключений -
исключение
AccessDeniedHttpException,
которое преобразуется в HTTP-ответ 403 -
исключение
AuthenticationException,
которое сигнализирует об ошибке аутентификации -
исключение
InvalidCsrfTokenException,
которое выбрасывается при неверном CSRF-токене