Devise/Warden如何/在哪里生成用于在Redis中存储会话的该高速缓存密钥?

ctzwtxfj  于 2023-11-16  发布在  Redis
关注(0)|答案(1)|浏览(118)

在我使用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):

  1. Devise(还是Warden?)如何/何时/在何处生成该高速缓存密钥?
    1.该高速缓存密钥与会话ID有何关联?
  2. Rails控制器是否有办法访问或以编程方式获取会话的相应缓存键?
1szpjjfi

1szpjjfi1#

感谢Max的评论,我深入到了CacheStore的代码中,并理解了会话的id实际上不仅仅是一个字符串,而是一个在代码中作为sid传递的对象。该对象携带public_id(这是返回的字符串)和private_id(这看起来更像是我在Redis中看到的)。
基于我最初的例子:

session.id
# 'aaaabbbbccccdddd1111222233334444'

session.id.public_id
# 'aaaabbbbccccdddd1111222233334444'

session.id.private_id
# '2::984375urehgiuhfhe754w9873987e98trieydfijdoewsdjfh948570398408esf'

# and in the console:
redis = Redis.new
redis.keys
# ['_session_id::2::984375urehgiuhfhe754w9873987e98trieydfijdoewsdjfh948570398408esf']

字符串
看到private_id,Redis密钥就不那么神秘了。
为了准确地实现这一点,我调用了类似session.instance_variable_get('@by').send(:cache_key, session.id.private)的东西,其中@by是某种与CacheStore相关的示例,cache_key是生成用于与Redis接口的密钥的私有方法。

相关问题