класс ActionDispatch::Session::CookieStore
Этот основанный на 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'
Для генерации секретного ключа для существующего приложения выполните `rake 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 до обновления.
Обратите внимание, что изменение секретного ключа аннулирует все существующие сессии!
Публичные методы класса
# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 60
def initialize(app, options={})
super(app, options.merge!(:cookie_only => true))
end Публичные методы экземпляра
# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 64
def destroy_session(env, session_id, options)
new_sid = generate_sid unless options[:drop]
# Reset hash and Assign the new session id
env["action_dispatch.request.unsigned_session_cookie"] = new_sid ? { "session_id" => new_sid } : {}
new_sid
end # File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 71
def load_session(env)
stale_session_check! do
data = unpacked_cookie_data(env)
data = persistent_session_id!(data)
[data["session_id"], data]
end
end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.