Задать вопрос
Akuma
@Akuma
Веб-программист

Почему Symfony 2.3 разлогинивает пользователя с ROLE_IDDQD?

Доброе утро.

Сегодня пятница и как всегда происходят необычные вещи.

Есть проект на 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, то все работает как надо. Может, кто-то подкинет идею, в какую сторону копать?
  • Вопрос задан
  • 2509 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы