Хотя существуют более простые методы перенаправления пользователя на определенную страницу в соответствии с его ролью в приложении на основе Symfony 2 с помощью FOSUserBundle, например, обработка такой вещи в каком-либо действии контроллера вашего приложения:
isGranted('ROLE_ADMIN'))
{
return $this->redirectToRoute('admin_homepage');
}
else if($this->isGranted('ROLE_MANAGER'))
{
return $this->redirectToRoute('manager_homepage');
}
else
{
return $this->redirectToRoute('default_homepage');
}
}
Есть разработчики, которые любят делать вещи немного более сложными, хотя и довольно структурированными (например, реализовать слушатель входа в систему). В этой статье мы поделимся с вами самым простым способом реализации прослушивателя входа в систему, который перенаправляет зарегистрированного пользователя конкретному пользователю в соответствии с его ролью.
1. Создайте прослушиватель входа
Первое, что вам нужно сделать, это создать класс LoginListener, который будет обрабатывать перенаправление в соответствии с ролью пользователя, мы обычно создаем каталог внутри нашего основного пакета, а именно Listeners, и сохраняем все классы слушателей внутри. Таким образом, пространство имен класса будет AppBundle\Listeners
, Содержание класса следующее:
userManager = $userManager;
$this->router = $router;
$this->security = $security;
$this->dispatcher = $dispatcher;
}
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$this->dispatcher->addListener(KernelEvents::RESPONSE, array($this, 'onKernelResponse'));
}
public function onKernelResponse(FilterResponseEvent $event)
{
// Important: redirect according to user Role
if ($this->security->isGranted('ROLE_ADMIN')) {
$event->setResponse(new RedirectResponse($this->router->generate("admin_homepage")));
} elseif ($this->security->isGranted('ROLE_MANAGER')) {
$event->setResponse(new RedirectResponse($this->router->generate("manager_homepage")));
} else {
$event->setResponse(new RedirectResponse($this->router->generate("default_homepage")));
}
}
}
Слушатель будет ожидать 4 аргумента, которые мы добавим позже при регистрации слушателя. Первый аргумент — это менеджер пользователя, который вы зарегистрировали для своего приложения, в нашем случае мы использовали FOSUserBundle.
2. Зарегистрировать логин слушателя
После создания класса и изменения маршрутов перенаправления в соответствии с ролью подписанного пользователя необходимо зарегистрировать этот класс в services.yml
файл вашего проекта со следующим фрагментом (обратите внимание, что класс может меняться в зависимости от структуры файлов и пространств имен, которые вы используете):
# app/config/services.yml
services:
login_listener:
# path of the previously created class
class: AppBundle\Listeners\LoginListener
arguments:
userManager: "@fos_user.user_manager"
router: "@router"
security: "@security.context"
dispatcher: "@event_dispatcher"
tags:
- { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }
Сохраните изменения и очистите кеш вашего symfony с помощью php app/console cache:clear
и доступ к вашему приложению, в зависимости от роли пользователя.