本文概述
尽管可以使用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.创建一个登录监听器
你需要做的第一步是创建LoginListener类, 该类将根据用户的角色处理重定向, 我们通常在主捆绑包内创建一个目录, 即Listeners, 并将所有侦听器类保存在其中。因此, 该类的名称空间将为AppBundle \ Listeners。该类的内容如下:
<?php
// Change the namespace according to the location of this class in your bundle
namespace 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 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 }
保存更改并使用php app / console cache清除symfony的缓存:根据用户角色, 清除并访问你的应用程序。
编码愉快!
评论前必须登录!
注册