Rails 7中session_id Cookie与sessions表值不一致问题咨询
Rails中ActiveRecord会话存储的Session ID不一致问题
问题描述
我在Rails中使用active_record_store存储会话,配置文件session_store.rb内容为:
Rails.application.config.session_store :active_record_store
为满足日志记录需求,我编写了读取/解析会话数据的代码。用户登录UI后,sessions表中新增记录的session_id示例为:
2::cbd180f1b721cc89d70e417661cf43c83f34d1c967a76daf14ca77db094a423a
但在控制器中读取cookies['_session_id']得到的值却是:
eac9bd2420e0f5dbdfc22654df3b78dc
请问该不一致现象的原因是什么?
原因解析
这是因为Rails对会话ID做了双重安全处理:
Cookie中的值是原始会话ID的哈希结果
Rails为避免直接暴露原始会话ID带来的安全风险,会对原始会话ID结合应用密钥做哈希运算(默认采用SHA1算法),将得到的哈希值存入_session_idCookie。当请求到达时,Rails会重新计算哈希值与Cookie内容对比,验证通过后才会用原始会话ID去数据库匹配对应记录。数据库中存储的是带版本标识的原始会话ID
数据库里的session_id格式为[版本号]::[原始会话ID]:2::是会话ID的版本前缀(不同Rails版本可能有不同的版本号)- 后缀字符串是未经过哈希的原始会话ID
简单来说,Cookie里的是原始会话ID的哈希值,数据库里的是带版本标记的原始会话ID,二者并非同一内容,因此出现不一致。
如果需要在代码中关联两者,不要直接解析Cookie,而是通过Rails内置的会话机制获取:比如在控制器中可以用request.session_options[:id]拿到数据库中存储的完整会话ID,或者用request.session.id获取原始会话ID(不同Rails版本的API可能略有差异)。
内容的提问来源于stack exchange,提问作者D. Cooper
相关产品推荐
相关产品推荐

