Вот что произошло: p>
- Я вошел в систему как пользователь A
- Я перешел на страницу, на которой хранится переменная X в сеансе < /li>
Я вышел из системы, но браузер не закрыл. - Файл сеанса в хранилище/фреймворке/сессиях все еще был там, и браузер
cookie был жив. - Я вошел в систему как пользователь B.
- Старый файл сеанса в хранилище/framework/sessions был удален и появился новый файл сеанса был там.
- Я заглянул в новый файл сеанса – сюрприз! переменная X пережила выход из системы и по-прежнему доступна пользователю B!
Во время отладки исходного кода Laravel я обнаружил, что хранилище сеансов никогда не очищается во время процесса выхода из системы или входа в систему. В методе Illuminate\Auth\Guard::clearUserDataFromStorage() удаляются только учетные данные для входа, но все атрибуты хранилища сеансов все еще присутствуют, а затем позже, когда $kernel->terminate($request, $response); вызывается, что, в свою очередь, приводит к вызову Illuminate\Session\Middleware\StartSession::terminate() Store::save(), который слепо сохраняет $this->attributes в новую сессию, игнорируя тот факт, что она теперь принадлежит другому пользователю.
С одной стороны, это кажется логичным — у Laravel нет никаких предположений относительно моих данных и того, являются ли они Я хочу, чтобы срок его действия истек вместе с аутентификацией или нет. Но было бы здорово задокументировать это где-нибудь с решением, позволяющим прикрепить некоторые конфиденциальные данные к объекту аутентификации и срок их действия истекает вместе с ним.
Это означает, что я, как программист несет ответственность за полное удаление всех конфиденциальных данных из текущего сеанса при входе в систему нового (или того же) пользователя.
Очистка при входе в систему out не будет надежным, поскольку пользователь может никогда не щелкнуть ссылку «Выход» и дождаться истечения срока действия сеанса, что для Laravel все равно не очистит сеанс.
Один Еще одна вещь, о которой следует помнить: мне не следует очищать сеанс слишком рано - должен присутствовать токен AntiForgery, иначе форма входа всегда будет завершаться ошибкой.
У меня есть нашел тему на форуме, которая также пытается решить похожую проблему:
http://laravel.io/forum/04-27-2014-how-to-expire- session-data
Меня это смутило:
У меня была еще одна попытка сегодня попробовал и понял, в чем проблема: Session::flush() не удаляет данные сеанса, созданные приложением, например данные корзины покупок
Если это правда, то единственный способ полностью избавиться от сеанса — использовать встроенные PHP session_unset() и session_destroy(), но я бы не хотел этого делать способ - я бы предпочел найти более чистое решение в стиле Laravel, если это возможно.
Как мне сказать Laravel, что я хочу, чтобы мои старые данные сеанса были удаляется вместе с данными аутентификации пользователя по истечении срока действия аутентификации или при выходе пользователя из системы?
Подробнее здесь: https://stackoverflow.com/questions/307 ... rent-users