Intereting Posts
ХРОМ НЕ ОТКРЫВАЮЩИХ ПЕЧЕНЬ ЗАКРЫТИЯ на закрытии / выходе PHP – редактирование / удаление определенной строки в файле Почему функция как элемент массива в php-классе не работает как сгенерировать PDF с использованием вида блейдов с tcpdf laravel 5? Лучший способ разбора RSS / Atom-каналов с PHP Zend Framework 2 Маршрутизация поддоменов к модулю Счетчик просмотров страниц с помощью PHP и MySQL? Есть ли лучший способ обрабатывать 300 000 строк текстовых файлов и вставлять их в MySQL? зарегистрировать js для определенной страницы в script-calls.php Как получить значения полей из «Carbon Fields 2.1.0» WP-plugin? На какой стадии они доступны? Обнаруживать непустую строку с регулярным выражением? «Установить имена» и mysqli_set_charset – кроме того, что они влияют на mysqli_escape_string, они идентичны? Захват экрана с помощью PHP и / или Javascript? Как получить значение hash (#) в строке запроса Лучший способ справиться с ошибками в полнотекстовом поиске MySQL

Войдите в систему программно и оставайтесь в системе

Я пытаюсь реализовать единый знак доступа к веб-сайту с помощью Symfony2.

Сама аутентификация работает нормально, но только для начальной страницы. На следующей загруженной странице пользователь больше не войдет в систему.

Соответствующий код:

$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles()); $event = new InteractiveLoginEvent($request, $token); $this->get("event_dispatcher")->dispatch(SecurityEvents::INTERACTIVE_LOGIN, $event); $this->get("security.context")->setToken($token); return $this->redirect($this->generateUrl('sonata_user_profile_show')); 

Первая страница (без перенаправления):

Начальная страница - вход в систему

Вторая страница:

Вторая страница - не авторизованы больше

Related of "Войдите в систему программно и оставайтесь в системе"

Для пользовательского входа требуется только следующий код.

 $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles()); $this->get("security.context")->setToken($token); return $this->redirect($this->generateUrl('sonata_user_profile_show')); 

Это делает настройку UsernamePasswordToken в контексте безопасности. Этот токен (а также пользователь) будет сериализован и помещен в сеанс. На следующей странице токен будет неэтериализован из сеанса, а обновленный, а также несертифицированный пользователь будет обновлен.

Пользователь-поставщик в FOSUserBundle делает это обновление, используя идентификатор несериализованного пользователя.

Кроме того, Doctrine2 в некоторых случаях использует прокси-классы как сущности-классы вместо исходного класса сущности. Этот прокси-класс перезаписывает функцию «getId ()» объекта сложной реализацией сложной ленивой загрузки.

Это вместе может привести к тому, что когда вы помещаете прокси-объект Doctrine2 в UserPasswordToken, «getId ()» сериализованного и затем несертифицированного прокси-объекта не вернет исходный идентификатор. Когда это произойдет, пользователь не может быть обновлен пользователем-провайдером, а токен станет недействительным.

Исправить это – создать пользовательский пользовательский провайдер, который перезаписывает «refreshUser ()» путем обновления с использованием имени пользователя (или другого уникального свойства).

 //... class UserProvider extends FOSUserProvider { /** * {@inheritDoc} */ public function refreshUser(SecurityUserInterface $user) { if (!$user instanceof User) { throw new UnsupportedUserException(sprintf('Expected an instance of User, but got "%s".', get_class($user))); } if (null === $reloadedUser = $this->userManager->findUserBy(array('username' => $user->getUsername()))) { throw new UsernameNotFoundException(sprintf('User with username "%s" could not be reloaded.', $user->getUsername())); } return $reloadedUser; } }