本文概述
- 1.创建一个登录监听器
- 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的缓存:根据用户角色, 清除并访问你的应用程序。
编码愉快!
推荐阅读
- 如何在CentOS中安装bcmath扩展
- 如何在Symfony 3.4中使用MonologBu??ndle通过电子邮件自动报告异常
- 我应该使用’#’还是’javascript(void(0);’在我的空链接的href属性上)
- 如何在Symfony 1.4中检索当前模块的名称
- 如何摆脱PHP警告(json_encode()期望参数2长,给定字符串)
- 如何在PHP中按键对关联数组进行分组
- 如何在Symfony 1.4中通过HTTPS(HTTP over SSL)强制全局访问
- Android JobScheduler需要先检查是否正常工作,然后再运行其他任务
- 无法解析Android中的方法'execute()'