Команда make:voter
Команда make:voter генерирует класс Voter,
который используется в системе безопасности Symfony
для проверки прав пользователя на доступ к ресурсу.
Первым параметром передаётся имя класса voter.
После выполнения команды в проекте появляется
готовый класс с методом vote, который
возвращает результат проверки.
Синтаксис
php bin/console make:voter VoterName
Пример
Давайте создадим voter для проверки прав на редактирование статьи:
php bin/console make:voter ArticleVoter
Результат выполнения команды:
created: src/Security/Voter/ArticleVoter.php
Success!
Next: Open your new voter class and add your logic.
Пример
Давайте посмотрим на сгенерированный класс voter:
<?php
namespace AppSecurityVoter;
use SymfonyComponentSecurityCoreAuthorizationVoterVoter;
use SymfonyComponentSecurityCoreAuthorizationVoterVote;
use SymfonyComponentSecurityCoreAuthenticationTokenTokenInterface;
class ArticleVoter extends Voter
{
protected function supports(string $attribute, mixed $subject): bool
{
return false;
}
protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool
{
return false;
}
}
?>
Пример
Давайте реализуем логику проверки для атрибута
EDIT над объектом статьи:
<?php
namespace AppSecurityVoter;
use AppEntityArticle;
use AppEntityUser;
use SymfonyComponentSecurityCoreAuthorizationVoterVoter;
use SymfonyComponentSecurityCoreAuthenticationTokenTokenInterface;
class ArticleVoter extends Voter
{
protected function supports(string $attribute, mixed $subject): bool
{
return $attribute === 'EDIT' && $subject instanceof Article;
}
protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool
{
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
return $subject->getAuthor() === $user;
}
}
?>
Пример
Давайте используем voter в контроллере для проверки прав текущего пользователя:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentSecurityHttpAttributeIsGranted;
class ArticleController extends AbstractController
{
#[Route('/article/{id}/edit', name: 'article_edit')]
#[IsGranted('EDIT', subject: 'article')]
public function edit(Article $article): Response
{
return new Response('article');
}
}
?>
Смотрите также
-
команда
make:user,
которая создаёт класс пользователя для системы безопасности -
команда
make:auth,
которая генерирует аутентификацию через формы -
команда
debug:firewall,
которая показывает настройки firewall и voters -
команда
make:controller,
которая создаёт класс контроллера