在我使用Devise和Redis的Rails应用程序中,我可以调用这些东西并获得会话的ID:
# app/controllers/some_controller.rb
session.id
session[:session_id]
cookies['session_cookie']
字符串
上面所有匹配项返回的值,例如,假设它是aaaabbbbccccdddd1111222233334444
。
当应用程序中发生这种情况时,我可以运行控制台并获取会话的该高速缓存密钥:
# in the Rails console
redis = Redis.new
redis.keys
型
这里显示的和之前的ID完全不一样,更像是_session_id::2::984375urehgiuhfhe754w9873987e98trieydfijdoewsdjfh948570398408esf
。
问题是(S):
- Devise(还是Warden?)如何/何时/在何处生成该高速缓存密钥?
1.该高速缓存密钥与会话ID有何关联? - Rails控制器是否有办法访问或以编程方式获取会话的相应缓存键?
1条答案
按热度按时间1szpjjfi1#
感谢Max的评论,我深入到了CacheStore的代码中,并理解了会话的id实际上不仅仅是一个字符串,而是一个在代码中作为
sid
传递的对象。该对象携带public_id
(这是返回的字符串)和private_id
(这看起来更像是我在Redis中看到的)。基于我最初的例子:
字符串
看到
private_id
,Redis密钥就不那么神秘了。为了准确地实现这一点,我调用了类似
session.instance_variable_get('@by').send(:cache_key, session.id.private)
的东西,其中@by
是某种与CacheStore相关的示例,cache_key
是生成用于与Redis接口的密钥的私有方法。