我需要将我的 Rails 3 应用程序中的 session 存储从 cookie_store 切换到 redis-session-store .这有很多原因(安全性、与其他 Rails 和非 Rails 应用程序的 SSO)。是否有关于如何不丢失所有当前 session 的最佳实践?
我能想到的是两步走的方法:
- 收集 N 天的所有用户 session 并将它们存储在数据库或 Redis 中(如果已存储则更新)。
- 使用存储的用户 session 在 Redis 中创建条目。
或者,也可以进行动态迁移。意思是读取cookies,使用secret key解密session数据,作为一个新的session存储在Redis中。
最佳答案
我意识到这张票已经很旧了,但这可能会对其他人有所帮助。我们最终将 session 存储更改为 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
关于ruby-on-rails - 在 Rails 3 中将 session 从 cookie_store 迁移到 Redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29629299/