我需要将我的Rails 3应用中的会话存储从 cookie_store 切换到redis-session-store。这有很多原因(安全性,SSO与其他Rails和非Rails应用程序)。是否有关于如何做的最佳实践而不会失去所有当前会话?
我能想象的是两步法:
或者,也可以实时迁移。表示读取cookie,使用密钥解密会话数据并将其作为新会话存储在Redis中。
答案 0 :(得分:0)
我知道这张票已经很旧了,但这可能会对其他人有所帮助。我们最终将会话存储区更改为Redis,但随后仍在寻找旧Cookie(一两个星期),然后不再尊重它们。
在使用此策略之前,可能需要考虑一些安全问题-与必须一次注销整个用户库的成本相比,您要确保这些风险值得承担。使用Rails,Cookie被加密并且不能被篡改。
这是我们使用的:
class SessionsController < Devise::SessionsController
LEGACY_COOKIE_NAME = "_old_session_name".freeze
def new
return if detect_valid_cookie
super
end
private
def detect_valid_legacy_cookie
legacy_cookie = request.cookie_jar.encrypted[LEGACY_COOKIE_NAME].presence || {}
valid_user_id = legacy_cookie['warden.user.user.key'].try(:first).try(:first)
return unless valid_user_id
user = User.find_by(:id => valid_user_id)
return unless user
if sign_in user
request.cookie_jar.delete(LEGACY_COOKIE_NAME)
redirect_to root_path # or whever you want
true
else
false
end
end
end
答案 1 :(得分:-1)
从这里被盗:
http://www.happybearsoftware.com/almost-protect-yourself-from-cookie-session-store.html(最后两节)
基本上,请使用:
Rails.application.config.action_dispatch.cookies_serializer = :hybrid
引用如下:
这将导致Rails接受与Marshal序列化的会话,并将它们交换为使用JSON序列化的会话。
在确信所有用户会话都已转换为JSON后,您可以推出另一个将配置值翻转为:json的版本。
注意:如果您在会话中存储复杂的Ruby对象并需要使用Marshal进行序列化,那么您将无法使用JSON序列化程序。