Команда для очистки хранилища сеансов на основе файлов cookie в Rails

Я часто хочу очистить хранилище сеансов в Rails, в частности, хранилище сеансов на основе файлов cookie по умолчанию. Некоторые сайты, похоже, предполагают, что

rake tmp:sessions:clear

выполняет эту задачу, но, похоже, это не так. Каким образом можно очистить хранилище сеансов на основе файлов cookie?

Ответ 1

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

Возможно, вы можете использовать session.clear в своих контроллерах? Однако вы правы в изменении ключа cookie. Это приведет к аннулированию любого сеанса, принадлежащего старому ключу. Вам нужно будет спасти от ActionController::StaleSession (или что-то в этом роде), но это сработает.

Ответ 2

Если вы используете сеансы на основе файлов cookie

Вы можете изменить secret_token вашего приложения rails. Это приведет к аннулированию всех существующих сеансов.

rake secret

Затем скопируйте значение в

RAILS_ROOT/config/initializers/session_store.rb

Вот оно. Не забудьте перезапустить приложение после этого;)

Если вы используете сеансы на основе базы данных

rake db:sessions:clear

Если вы используете сеансы на основе файлов

rake tmp:sessions:clear

Ответ 3

Измените имя файла cookie сеанса. Он не будет удалять старые файлы cookie, но это заставит всех получить новый cookie сеанса.

Ответ 4

Теперь мне кажется, что то, что я хочу, может быть невозможно в зависимости от того, как реализовано хранилище на основе файлов cookie. Если файлы cookie содержат всю информацию, необходимую серверу (включая подпись для целостности данных), то серверу не нужно хранить какую-либо информацию на своей стороне, поэтому нет возможности аннулировать существующие файлы cookie. Я предположил, что в файле cookie содержится ключ, который соответствует данным на стороне сервера, чтобы проверить, что файл cookie действителен, но теперь я понимаю, что это может быть не так.

Если это так, то единственный способ очистить файлы cookie - это изменить секретный файл cookie на стороне сервера, используемый для подписания, а затем, предположительно, перезапустить серверный процесс.

Ответ 5

Если вы используете это на рабочем сервере, я рекомендую:

rake secret

Это просто генерирует случайный безопасный токен. Задача rake в основном делает это, что вы можете сделать в консоли.

SecureRandom.hex(64)

Никогда не проверяйте производственный ключ в управлении версиями / GIT, но вместо этого используйте переменную окружения. Поэтому в вашем файле config/secrets.yml используйте что-то вроде:

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>