我正在开发一个Symfony 2.7项目,如果会话过期,我想在特定页面上重定向用户。 我创建了一个侦听角色和路由的侦听器,如果用户试图访问经过身份验证的路由而未经过身份验证,则会重定向到特定页面。 这暂时不起作用,因为默认重定向到主页的优先级更高。
这是听众:
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Routing\Router;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
使用Symfony \ Component \ Security \ Core \ Authorization \ AuthorizationChecker;
class UserDisconnectionListener
{
protected $router;
protected $security;
protected $tokenStorage;
public function __construct(Router $router, AuthorizationChecker $security, TokenStorage $tokenStorage)
{
$this->router = $router;
$this->security = $security;
$this->tokenStorage = $tokenStorage;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$loggedRoutes = ['user_account', 'user_index', '...'];
$url = '';
if($this->tokenStorage->getToken() !== null) {
if(!$this->security->isGranted('IS_AUTHENTICATED_OPENID')) {
if (in_array($request->get('_route'), $loggedRoutes)) {
$url = $this->router->generate('disconnection_route');
}
}
if(strlen($url) > 0) {
$response = new RedirectResponse($url);
$event->setResponse($response);
}
}
}
}
app.userroute.listener:
class: app\UserBundle\Listener\UserDisconnectionListener
arguments: ['@router.default', @security.authorization_checker, @security.token_storage]
scope: request
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
有更好的方法吗? 我试图使用优先级标签,但我没有优先级设置。 我尝试登录,当我尝试访问'user_index'路线时,我的listerner日志说我已经在主页'general_index'路线上重定向。
PS:我正在使用FOSUserBundle和OpenID Bundle。
答案 0 :(得分:0)
tags:
- { name: kernel.event_listener, priority: -256, event: kernel.request, method: onKernelRequest }
https://symfony.com/doc/2.7/event_dispatcher.html检查symfony文档中的事件,并搜索优先级
此标记选项指定symfony以何种顺序调用侦听器。
这不是“硬编码”经过身份验证的路由列表的最佳方式,如果您忘记添加一个代码将无效。您应该尝试动态检索经过身份验证的路由