Подтвердить что ты не робот

Как работает фиксация сеанса Symfony2?

В соответствии со стандартной документацией 2.4 файл конфигурации security.yml позволяет использовать следующую конфигурационную опцию:

session_fixation_strategy: none | migrate | invalidate

источник: http://symfony.com/doc/current/reference/configuration/security.html

Однако я не могу найти каких-либо подробностей в официальной документации (или в другом месте) о том, что этот вариант действительно делает, или о том, как это работает на практике.

Итак, если я установил эту опцию либо "migrate", либо "invalidate", как это повлияет на обработку сеанса в моей системе? Например, если я установил его "invalidate", означает ли это, что контекстно-локальный сеанс недействителен, когда пользователь переходит к другому контексту безопасности?

4b9b3361

Ответ 1

Короче:

  • NONE: сеанс не изменяется
  • MIGRATE: обновляется идентификатор сеанса, сохраняются атрибуты
  • INVALIDATE: обновляется идентификатор сеанса, теряются атрибуты

Подробнее:

  • Нет стратегии: В реализации сеанса по умолчанию ничего не делается (предполагается), поэтому сеанс поддерживается из одного контекста в другой.

  • Миграция стратегии: "Переносит текущий сеанс на новый идентификатор сеанса, сохраняя все атрибуты сеанса". (Хранилище сеансов должно обновить текущий сеанс.) "Регенерировать идентификатор, который представляет это хранилище. Этот метод должен вызывать session_regenerate_id ($ destroy), если этот интерфейс не используется для объекта хранения, предназначенного для модульного или функционального тестирования, где реальная сессия PHP будет мешать тестированию. Примечание регенерировать + уничтожить не должно очищать данные сеанса в памяти, удаляя только данные сеанса из постоянного хранилища. " Таким образом, сеанс сохраняется из одного контекста в другой.

  • Недействительная стратегия: "Очищает все атрибуты сеанса и мигает и регенерирует сеанс и удаляет старый сеанс из-за сохранения". Таким образом, сеанс регенерируется из одного контекста в другой.

По вашему вопросу не было видно, какие данные сеанса вы пытаетесь извлечь.
Но в любом случае отдельный сеанс не создается для разных контекстов безопасности: http://symfony.com/doc/current/reference/configuration/security.html#firewall-context

Данные, связанные с безопасностью (аутентификацией), хранятся под отдельным ключом (на основе имени брандмауэра). Например, если у вас есть брандмауэр с именем "main", токен аутентификации будет храниться в "_security_main", если у вас есть брандмауэр (отдельный контекст) с именем "foo", данные пользователя и связанные с ним данные будут храниться в разделе "_security_foo" и т.д.

Таким образом, кроме того → getToken → getUser (и т.д.) остальные переменные сеанса будут доступны в разных контекстах, если вы используете стратегии "none" или "migrate".

Взгляните на интерфейс сеанса для получения подробной информации (кавычки из этих файлов) поставщик/Symfony/Symfony/SRC/Symfony/Компонент/HttpFoundation/Сессия/SessionInterface.php

И реализация по умолчанию: поставщик/Symfony/Symfony/SRC/Symfony/Компонент/HttpFoundation/Сессия/session.php