会话到期时,Symfony会阻止默认重定向

时间:2017-08-22 05:50:51

标签: symfony session listener

我正在开发一个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。

1 个答案:

答案 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以何种顺序调用侦听器。

这不是“硬编码”经过身份验证的路由列表的最佳方式,如果您忘记添加一个代码将无效。您应该尝试动态检索经过身份验证的路由