如何使用EventListener根据用户在Symfony 2.8中的角色将用户重定向到特定页面

本文概述

  • 1.创建一个登录监听器
  • 2.注册登录监听器
尽管可以使用FOSUserBundle根据用户在基于Symfony 2的应用程序中的角色将用户重定向到特定页面的方法更简单, 例如在应用程序控制器的某些操作中处理此类事情:
< ?php/** * Redirect users after login based on the granted ROLE * @Route("/login/redirect", name="_login_redirect") */public function loginRedirectAction(Request $request){if($this-> 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.创建一个登录监听器【如何使用EventListener根据用户在Symfony 2.8中的角色将用户重定向到特定页面】你需要做的第一步是创建LoginListener类, 该类将根据用户的角色处理重定向, 我们通常在主捆绑包内创建一个目录, 即Listeners, 并将所有侦听器类保存在其中。因此, 该类的名称空间将为AppBundle \ Listeners。该类的内容如下:
< ?php // Change the namespace according to the location of this class in your bundlenamespace AppBundle\Listeners; use FOS\UserBundle\Model\UserManagerInterface; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; use Symfony\Component\Routing\Router; use Symfony\Component\Security\Core\SecurityContext; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpFoundation\RedirectResponse; class LoginListener{protected $userManager; protected $router; protected $security; protected $dispatcher; public function __construct(UserManagerInterface $userManager, Router $router, SecurityContext $security, EventDispatcher $dispatcher){$this-> 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 Roleif ($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.ymlservices:login_listener:# path of the previously created classclass:AppBundle\Listeners\LoginListenerarguments:userManager: "@fos_user.user_manager"router: "@router"security: "@security.context"dispatcher: "@event_dispatcher"tags:- { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }

保存更改并使用php app / console cache清除symfony的缓存:根据用户角色, 清除并访问你的应用程序。
编码愉快!

    推荐阅读