Spec-Zone.ru › Ruby on Rails 5.1

класс ActionDispatch::Session::CookieStore

Родитель:
ActionDispatch::Session::AbstractStore

Этот хранилище сессий на основе cookie является стандартным для Rails. Оно значительно быстрее, чем альтернативные варианты.

Сессии обычно содержат в себе максимум идентификатор пользователя и сообщения всплывающих сообщений; оба значения помещаются в пределах лимита размера cookie в 4Кб. Исключение CookieOverflow генерируется, если вы пытаетесь сохранить более 4Кб данных.

Контейнер cookie, используемый для хранения, автоматически настраивается на лучший возможный вариант, учитывая конфигурацию вашего приложения.

Если у вас установлен только secret_token, ваши cookie будут подписаны, но не зашифрованы. Это означает, что пользователь не сможет изменить свои user_id без знания секретного ключа вашего приложения, но сможет легко прочитать свои user_id. Это было значением по умолчанию для приложений Rails 3.

Если у вас установлен secret_key_base, ваши cookie будут зашифрованы. Это идет дальше, чем подписанные cookie, так как зашифрованные cookie не могут быть изменены или прочитаны пользователями. Это значение по умолчанию начиная с Rails 4.

Если у вас установлены как secret_token, так и secret_key_base, ваши cookie будут зашифрованы, а подписанные cookie, сгенерированные Rails 3, будут прозрачно считываться и шифроваться, чтобы обеспечить плавный путь обновления.

Настройте хранилище сессий в config/initializers/session_store.rb:

Rails.application.config.session_store :cookie_store, key: '_your_app_session'

Настройте свой секретный ключ в config/secrets.yml:

development:
  secret_key_base: 'secret key'

Чтобы сгенерировать секретный ключ для существующего приложения, выполните команду `rails secret`.

Если вы обновляете существующее приложение Rails 3, вы должны оставить ваш существующий secret_token на месте и просто добавить новый secret_key_base. Обратите внимание, что вам следует подождать, чтобы установить secret_key_base, пока 100% ваших пользователей не перейдут на Rails 4 и вы не уверены, что вам не придётся откатываться до Rails 3. Это связано с тем, что cookie, подписанные с помощью нового secret_key_base в Rails 4, несовместимы с Rails 3. Вы можете оставить ваш существующий secret_token на месте, не устанавливать новый secret_key_base и игнорировать предупреждения об устаревании, пока вы не уверены, что обновление в остальном завершено. Кроме того, вы должны позаботиться о том, чтобы не полагаться на возможность декодирования подписанных cookie, сгенерированных вашим приложением, во внешних приложениях или JavaScript до обновления.

Обратите внимание, что изменение секретного ключа аннулирует все существующие сессии!

Поскольку CookieStore расширяет Rack::Session::Abstract::Persisted, многие из опций, описанных там, могут быть использованы для настройки cookie сессии, которые генерируются. Например:

Rails.application.config.session_store :cookie_store, expire_after: 14.days

установит срок действия cookie сессии автоматически через 14 дней после создания. Другие полезные опции включают :key, :secure и :httponly.

Публичные методы класса

new(app, options = {}) Показать исходный код
# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 66
def initialize(app, options = {})
  super(app, options.merge!(cookie_only: true))
end
Вызывает метод родительского класса ActionDispatch::Session::Compatibility.new

Публичные методы экземпляра

delete_session(req, session_id, options) Показать исходный код
# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 70
def delete_session(req, session_id, options)
  new_sid = generate_sid unless options[:drop]
  # Reset hash and Assign the new session id
  req.set_header("action_dispatch.request.unsigned_session_cookie", new_sid ? { "session_id" => new_sid } : {})
  new_sid
end
load_session(req) Показать исходный код
# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 77
def load_session(req)
  stale_session_check! do
    data = unpacked_cookie_data(req)
    data = persistent_session_id!(data)
    [data["session_id"], data]
  end
end

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API