Rails ActiveRecord Session Store в HTML5 SessionStorage Вместо Cookie
У моего приложения есть требование, чтобы пользователи регистрировались в разных аккаунтах на отдельных вкладках в своем браузере (мы специально настраиваем Chrome). Поскольку Rails использует файлы cookie для хранения информации о сеансе, когда пользователь входит в систему, они регистрируются на всех вкладках в браузере. Я использую метод хранения сеанса ActiveRecord, но даже идентификатор сеанса сохраняется как файл cookie.
Кажется, существует решение в использовании механизма HTML5 sessionStorage, ограниченного по охвату вкладкой или окном, в которое пользователь вошел в систему. Кажется, все, что мне нужно сделать, это прямое Rails для сохранения информации о сеансе в sessionStorage, а не в файлах cookie. Но я не могу найти никакой информации об этом вообще.
Предполагая, что нет способа настроить хранилище сеансов для этого в Rails, можно ли переопределить механизм сохранения сеанса ActiveRecord? Любые указатели на то, где искать информацию о том, как это сделать?
Ответы
Ответ 1
В отличие от файлов cookie, записи sessionStorage не могут создаваться с заголовками ответов и не включаются автоматически в заголовки запросов. Это накладывает большую нагрузку на управление аутентификацией sessionStorage/localStorage на клиентском Javascript. Весь аутентифицированный доступ должен быть через запросы Javascript XHR, которые явно включают токен аутентификации.
Если вы хотите, чтобы у пользователя было несколько одновременных сеансов, и вы не хотите создавать свой сайт как SPA, тогда вам придется использовать альтернативный подход с помощью файлов cookie.
Одним из способов было бы использование нескольких доменов для принудительного добавления файлов cookie в отдельные подпространства. Установите подстановочную DNS-запись и настройте веб-сервер для принятия всех соответствующих запросов независимо от префикса. Например, пользователи могут по умолчанию находиться в www.yoursite.com
. Вы бы предоставили ссылку "создать новый сеанс", которая открывает новую вкладку в случайный субдомен, например. 1234abcd.www.yoursite.com
. Это может создать проблему, если вы используете SSL; Подстановочные SSL-сертификаты, как правило, намного дороже.
Проще было бы просвещать пользователей о своих режимах private/icognito своих браузеров, которые поддерживают независимые хранилища файлов cookie. Тем не менее, заставить пользователей читать документацию всегда сложно.
Ответ 2
Теперь вы настраиваете хранилище сеансов на основе файлов cookie через инициализатор, возможно, в config/initializers/session_store.rb. В Rails 3 хранилище сеансов является частью промежуточного программного обеспечения, и параметры конфигурации передаются одним вызовом config.session_store:
Ваш:: Application.config.session_store: cookie_store,: key = > '_session'
Вы можете поместить любые дополнительные параметры в хэш с помощью: клавиши, например.
Your::Application.config.session_store :cookie_store, {
:key => '_session_id',
:path => '/',
:domain => nil,
:expire_after => nil,
:secure => false,
:httponly => true,
:cookie_only => true
}