У меня есть несколько пользовательских ролей на моем сайте. Некоторые контроллеры имеют ограничения доступа в зависимости от роли пользователя.
У меня также есть меню (на основе KnpMenuBundle), и мне нужно включить только те элементы, которые доступны для вошедшего в систему пользователя.
Сейчас я решил отфильтровать элементы следующим образом:
1. Добавьте ко всем защищенным маршрутам новую опцию roles
то есть roles: [ROLE_ADMIN, ROLE_MANAGER]
2. При построении меню сопоставьте текущие роли пользователя с параметром.
Я пытался выяснить, есть ли такая функциональность в Symfony (я имею в виду ограничение роли, определенное в настройках маршрута), но мне не удалось найти что-то подобное.
Итак, у меня есть следующие вопросы:
1. Как отфильтровать пункты меню по ролям пользователей? (Может быть, уже есть функциональность для этого?)
Если ответ на предыдущий вопрос «нет», то:
2. как я могу построить такую фильтрацию самостоятельно? Как я уже упоминал, я решил добавить новую опцию в этом случае, так как сделать это наилучшим образом?
Может быть, вы могли бы использовать мой KnpMenu Builder в качестве примера?
namespace AppBundle\Menu;
use Knp\Menu\FactoryInterface;
use Symfony\Component\DependencyInjection\ContainerAware;
class Builder extends ContainerAware
{
public function mainMenu(FactoryInterface $factory, array $options)
{
$sc = $this->container->get('security.context');
$menu = $factory->createItem('root');
$menu->setChildrenAttribute('class', 'nav navbar-nav');
$menu->addChild('About us', array('route' => 'about'));
$menu->addChild('Contact', array('route' => 'contact'));
/*
* before we use isGranted() we have to check if the security is available, otherwise we will receive an exception on the custom error pages. See also
* http://symfony.com/doc/current/cookbook/controller/error_pages.html#avoiding-exceptions-when-using-security-functions-in-error-templates
*/
if($sc->getToken())
{
$menu->addChild('Members', array('uri' => '#'))
->setAttribute('dropdown', true);
if($sc->isGranted('IS_AUTHENTICATED_REMEMBERED'))
{
$menu['Members']->addChild('My profile', array('route' => 'fos_user_profile_show'));
if($sc->isGranted('ROLE_ADMIN'))
{
$menu['Members']->addChild('Dashboard', array('route' => 'sonata_admin_dashboard'))
->setAttribute('divider_append', true);
}
$menu['Members']->addChild('Logout', array('route' => 'fos_user_security_logout'));
}
else
{
$menu['Members']->addChild('Login', array('route' => 'fos_user_security_login'));
$menu['Members']->addChild('Registration', array('route' => 'fos_user_registration_register'));
}
}
return $menu;
}
}
Других решений пока нет …