Команда для очистки хранилища сеансов на основе файлов 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"] %>