Метод isGranted
Метод isGranted проверяет, обладает ли текущий пользователь указанным разрешением или ролью. Первым параметром передаётся проверяемое разрешение в виде строки, например 'ROLE_ADMIN' или 'ROLE_USER'. Вторым необязательным параметром можно передать субъект, для которого проверяется разрешение. Метод возвращает true, если доступ разрешён, и false в противном случае.
Метод вызывается внутри контроллера, унаследованного от AbstractController. Если пользователь не авторизован, метод также возвращает false, а не выбрасывает исключение.
Синтаксис
isGranted(string $attribute, mixed $subject = null): bool
Пример
Давайте проверим, есть ли у текущего пользователя роль 'ROLE_ADMIN', и вернём соответствующий ответ:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
if ($this->isGranted('ROLE_ADMIN')) {
return new Response('admin access');
}
return new Response('user access');
}
}
?>
Результат выполнения кода для пользователя с ролью 'ROLE_ADMIN':
"admin access"
Результат выполнения кода для обычного пользователя:
"user access"
Пример
Давайте используем метод isGranted совместно с denyAccessUnlessGranted для ограничения доступа к действию контроллера:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/edit', name: 'article_edit')]
public function edit(): Response
{
if (!$this->isGranted('ROLE_EDITOR')) {
throw $this->createAccessDeniedException('Access denied');
}
return new Response('article edited');
}
}
?>
Результат выполнения кода для пользователя с ролью 'ROLE_EDITOR':
"article edited"
Пример
Давайте проверим разрешение для конкретного субъекта, передав его вторым параметром:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show')]
public function show(Article $article): Response
{
if ($this->isGranted('ARTICLE_VIEW', $article)) {
return new Response('article visible');
}
return new Response('article hidden');
}
}
?>
Результат выполнения кода при наличии разрешения 'ARTICLE_VIEW' для статьи:
"article visible"
Смотрите также
-
класс
AbstractController,
который предоставляет метод isGranted -
метод
denyAccessUnlessGranted,
который выбрасывает исключение при отсутствии доступа -
метод
getUser,
который возвращает текущего пользователя -
метод
redirectToRoute,
который выполняет редирект на маршрут