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
}