Компонент Symfony добавляет данные в сеанс и портит данные. - PullRequest
0 голосов
/ 30 сентября 2019

В нашем приложении мы делимся данными сеанса между новым отделенным приложением, созданным с помощью symfony 4.3, и старым унаследованным кодом. Обе кодовые базы управляют данными сеанса на серверах memcached. В приложении Symfony мы используем Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler для обработки данных, и мы переопределили два его метода для заполнения стандартного пакета сеансов Symfony, называемого _sf2_attributes, эти два метода выглядят так:

   * Symfony attributes bag key
   */
  const SF_ATTRIBUTES_BAG_KEY = '_sf2_attributes';

  /**
   * read session from memcached
   *
   * @param string $sessionId Id of session
   *
   * @return string
   */
  protected function doRead($sessionId) {
    $data = parent::doRead($sessionId);

    return serialize(
        [
        self::SF_ATTRIBUTES_BAG_KEY => empty($data) ? [] : unserialize($data)
        ]
    );
  }

  /**
   * Write session data into session
   *
   * @param string $sessionId id of  session
   * @param string $data      data to write
   *
   * @return bool
   */
  protected function doWrite($sessionId, $data) {
    $data = unserialize($data);
    $data = array_key_exists(self::SF_ATTRIBUTES_BAG_KEY, $data) ? $data[self::SF_ATTRIBUTES_BAG_KEY] : [];

    return parent::doWrite($sessionId, serialize($data));
  }

Однаков какой-то момент совершенно случайно данные сеанса не могли быть прочитаны. При выполнении этого и отладке с помощью запроса memcached для моего сеанса я вижу, что данные там повреждены и выглядят как

631:"O:37:"Namespace\Namespace2\Models\U %_S�<_`":17@d
16:"is_auth iicated�^8�dmi�q13�_view�+1 ~   

и так далее. Сравнивая их с «обычными» данными сеанса сразу после обновления сеанса, я вижу единственное отличие: поврежденные данные содержат следующее: Symfony\Comp �nt\S�-\Guard\TD�\BSA�"``":394:{a#�!�@� t�jD�*��Of�App�bCo" .{ �!/*!j�*_ $ȤI*H b��GU@x�(@]�"@�"O r' �O@1!ROLE_ADMIDn} R!�1 Z2 �$�@(O:4 ��.C%�\Gk`+@@�4!b� 4`�A�1� �3 �FW# ]@�s� *}}";}, что, вероятно, означает, что Symfony\Component\Guard, который мы используем, добавляет некоторые данные, вызывая наши перезаписанныеdoWrite и повреждение данных.

Вопросы:

  1. Есть ли событие, когда компонент защиты добавляет данные в сеанс? Мы ничего не сохраняем в аутентификаторе сеанса, а просто читаем данные. Нам нужно получить шаги, чтобы воспроизвести это
  2. Есть идеи, как это исправить?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...