Rails 4.2如何禁用Cookie加密?需兼容Rails 3应用
嘿,我之前刚好处理过一模一样的场景,要让升级后的Rails 4.2应用生成和Rails 3.2兼容的Cookie,其实只需要调整几个核心配置项就行,具体步骤如下:
1. 修改Session Store核心配置
在你的Rails 4.2应用的config/initializers/session_store.rb文件中,调整session store的参数,关闭Rails 4+默认的Cookie加密特性,同时保持和Rails 3.2一致的签名行为:
Rails.application.config.session_store :cookie_store, key: '_your_app_session', # 这里要和Rails 3应用使用的Cookie key完全一致 encrypt: false, # 关闭Rails 4.2默认启用的Cookie加密 signed: true # 保留签名功能(和Rails 3.2默认行为一致,防止Cookie被篡改)
小提醒:如果你的Rails 3应用连签名都没开启(这种情况比较少见),可以把
signed: true改成signed: false,但不建议这么做——毕竟签名能有效防止Cookie被恶意篡改,安全性会打折扣。
2. 确保密钥跨版本兼容
Rails 3.2用的是config/initializers/secret_token.rb里的secret_token,而Rails 4.2换成了config/secrets.yml里的secret_key_base。为了让两个应用能互相解析签名后的Cookie,必须让Rails 4.2应用使用和Rails 3应用完全相同的密钥:
- 复制Rails 3应用中
secret_token.rb里的密钥字符串 - 把Rails 4.2应用
config/secrets.yml里的secret_key_base值替换成这个复制的密钥
举个例子:
# config/secrets.yml production: secret_key_base: "这里粘贴Rails 3应用的secret_token完整值"
3. 验证Cookie格式是否匹配
修改完配置后重启Rails 4.2应用,然后检查生成的Cookie内容:
- Rails 3.2的Cookie值是「内容--签名哈希」的格式
- Rails 4.2关闭加密后生成的Cookie应该和这个格式完全一致,这样Rails 3应用就能正常解析了
如果想快速测试,可以打开Rails控制台手动生成Cookie验证:
# 在Rails 4.2控制台中执行 cookies.signed[:test] = "hello_rails_3" puts cookies[:test] # 应该输出类似"hello_rails_3--xxxxxxxxx"的格式,和Rails 3生成的一致
内容的提问来源于stack exchange,提问作者Sachin R
相关产品推荐
相关产品推荐

