Задать вопрос

Как организовать роли в Symfony?

Добрый день.

Суть вопроса: есть приложение, есть пользователи. Каждый пользователь относится к какой то группе пользователей, эти группы хочу хранить в БД. У каждой группы есть набор прав. Схема не иерархическая, группы абсолютно разные и эти группы (роли) можно менять в админке, то есть давать и забирать какие либо права.

Собственно вопрос - как это сделать в Symfony?

Смотрел в доках, видел что это можно делать в security.yaml, но прав будет довольно много, да и ролей будет неточное множество, может и 10, а может и 20. И каждый раз, когда появляется роль, не хотелось бы лезть в secutiry.yaml чтобы добавлять роли.

Видится что то типа проверки isGranted при запросе какого то роута, и при наличии прав, юзер видит страницу.
  • Вопрос задан
  • 2473 просмотра
Подписаться 12 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
security.yml
security:
    access_control:
        - { path: ^/ }

RequestVoter.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Core\Security;

class RequestVoter implements VoterInterface
{
    /**
     * @var Security
     */
    private $security;

    public function __construct(Security $security)
    {
        $this->security = $security;
    }

    /**
     * @inheritDoc
     */
    public function vote(TokenInterface $token, $subject, array $attributes)
    {
        if (!$subject instanceof Request) {
            return self::ACCESS_ABSTAIN;
        }

        $route = $subject->attributes->get('_route');
        $routeRole = $this->getRoleByRoute($route);

        if ($this->security->isGranted($routeRole)) {
            return self::ACCESS_GRANTED;
        }

        return self::ACCESS_DENIED;
    }

    protected function getRoleByRoute(string $route): string
    {
        // ...
    }
}
Ответ написан
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Секунду. В Symfony до сих пор нет нормального RBAC/ACL?
Ответ написан
Роли (точнее иерархию ролей) вам в любом случае указывать в security.yaml, как и указывать в коде is_granted(ROLE_XXXX). В админке можете добавлять и удалять роли (пара строк sonata admin). Если хотите все это делать через какой-то готовый интерфейс - пилите сами или ищите бандл для этого, где-то такое уже видел.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы