Атрибут IsGranted
Атрибут IsGranted вешается на метод
контроллера и проверяет, имеет ли текущий
пользователь указанную роль или право доступа.
Первым параметром передаётся роль или право,
вторым - субъект для проверки. Если доступ
запрещён, Symfony выбрасывает исключение
AccessDeniedException.
Синтаксис
#[IsGranted(attribute, subject: subject, message: message)]
Пример
Давайте ограничим доступ к методу контроллера
только для пользователей с ролью ROLE_ADMIN:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class ArticleController extends AbstractController
{
#[IsGranted('ROLE_ADMIN')]
public function index(): Response
{
return new Response('admin page');
}
}
?>
Если пользователь имеет роль ROLE_ADMIN,
то он увидит результат выполнения кода:
"admin page"
Пример
Давайте проверим доступ по праву EDIT
к объекту статьи, переданному в качестве субъекта:
<?php
namespace App\Controller;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class ArticleController extends AbstractController
{
#[IsGranted('EDIT', subject: 'article')]
public function edit(Article $article): Response
{
return new Response('article edited');
}
}
?>
Если пользователь имеет право EDIT на статью,
то результат выполнения кода будет таким:
"article edited"
Пример
Давайте зададим собственное сообщение об ошибке при отказе в доступе:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class ArticleController extends AbstractController
{
#[IsGranted('ROLE_ADMIN', message: 'Access denied for this page')]
public function secret(): Response
{
return new Response('secret data');
}
}
?>
Если доступ разрешён, результат выполнения кода:
"secret data"
Смотрите также
-
метод
isGranted,
который проверяет права доступа программно -
класс
AuthorizationChecker,
который выполняет проверку прав доступа -
класс
Voter,
который реализует логику проверки прав -
класс
Security,
который предоставляет доступ к текущему пользователю