Доброе утро.
Сегодня пятница и как всегда происходят необычные вещи.
Есть проект на Symfony 2.3. В событии onKernelRequest реализован динамический роутинг. По сути определяем контроллен по URL и подсовываем его системе.
Казалось бы, все хорошо. Но, если у пользователя есть роль ROLE_IDDQD, то он автоматически разлогинивается системой. Если авторизоваться с REMEMBERME, то авторизация все же сохраняется благодаря куке, но...перестает работать разлогинивание.
Пробовал отключать параметр для iddqd:
jms_security_extra:
enable_iddqd_attribute: false
Пробовал выяснить на каком моменте все ломается: после того как в контроллере делаю
return new Response('any content');
авторизация слетает.
Пробовал обновлять все зависимости. Не помогло.
Выяснил, что все дело в этом нестандартном роутинге, т.к. если роут жестко задан, то все нормально работает. Сам метод взял где-то на просторах интернета, разобрался что к чему и немного модифицировал:
public function onKernelRequest(GetResponseEvent $event)
{
if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
return;
}
$request = $event->getRequest();
if ($request->attributes->has('_controller')) {
return;
}
if (!$this->currentNode->hasCurrentPath()) {
$this->currentNode->setCurrentPath(mb_strtolower($request->getPathInfo()));
}
if (!$this->currentNode->hasNode()) {
return;
}
try{
list($bundle, $controller) = explode(':', $this->currentNode->getNode()->getController()->getController());
$controllerFilePath = $this->kernel->locateResource($bundle).'Controller/'.basename($controller).'.php';
$routeCollection = $this->annotationFileReader->load($controllerFilePath);
$routeCollection->addPrefix($this->currentNode->getNode()->getUrl(true));
} catch (\Exception $e) {
return;
}
$matcher = new UrlMatcher($routeCollection, $this->router->getMatcher()->getContext());
try {
$params = $matcher->match($this->currentNode->getCurrentPath().'/');
} catch (ResourceNotFoundException $e) {
try {
$params = $matcher->match($this->currentNode->getCurrentPath());
} catch (ResourceNotFoundException $e) {
return;
}
}
$params['node'] = $this->currentNode->getNode();
$request->attributes->add($params);
unset($params['_route']);
unset($params['_controller']);
$request->attributes->set('_route_params', $params);
}
Если у пользователя нет роли ROLE_IDDQD, то все работает как надо. Может, кто-то подкинет идею, в какую сторону копать?