Класс AuthorizationChecker
Класс AuthorizationChecker - это сервис Symfony,
который проверяет права доступа текущего пользователя.
Он получает токен из TokenStorage и передаёт его
системе голосования (Voter), которая выносит решение.
Основной метод isGranted принимает атрибут
(обычно роль или имя Voter-атрибута) и возвращает
true, если доступ разрешён, и false - если нет.
Синтаксис
<?php
public function isGranted(mixed $attribute, mixed $subject = null): bool
?>
Пример
Давайте внедрим AuthorizationChecker в контроллер
и проверим роль ROLE_ADMIN:
<?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\Authorization\AuthorizationCheckerInterface;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(AuthorizationCheckerInterface $checker): Response
{
if ($checker->isGranted('ROLE_ADMIN')) {
return new Response('admin page');
}
return new Response('access denied');
}
}
?>
Результат выполнения кода для пользователя с ролью ROLE_ADMIN:
"admin page"
Пример
Давайте проверим доступ к конкретному объекту,
передав его вторым параметром subject:
<?php
namespace App\Controller;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show')]
public function show(Article $article, AuthorizationCheckerInterface $checker): Response
{
if ($checker->isGranted('ARTICLE_EDIT', $article)) {
return new Response('edit allowed');
}
return new Response('edit denied');
}
}
?>
Результат выполнения кода, если Voter разрешил доступ:
"edit allowed"
Пример
Давайте вызовем метод isGranted из Twig-шаблона
через встроенную функцию is_granted:
{% if is_granted('ROLE_ADMIN') %}
<p>admin panel</p>
{% else %}
<p>user panel</p>
{% endif %}
Результат выполнения кода для администратора:
<p>admin panel</p>
Смотрите также
-
метод
isGranted,
который проверяет права доступа -
класс
Security,
который предоставляет доступ к сервисам безопасности -
класс
TokenStorage,
который хранит токен текущего пользователя -
класс
Voter,
который выносит решение о доступе