使用 Devise(Warden)+ Redis 管理的 Rails 会话中,废除特定用户的会话信息

你想要做什么?

我想要销毁一个在使用Redis和Devise进行认证管理的Rails应用中特定用户的所有会话。

怎么做呢 zuò ne)

只需要从会话存储中提取出目标用户的会话信息进行删除即可。

Rails使用sessions:session_id(session_id由Rails生成)作为键来保存会话信息。Warden则在该会话信息中使用warden.user.user.key(保持不变)作为键来保存用户ID等认证信息。

mapping = 'user'
user_id = 42

# Redisからすべてのセッション情報を抽出
Redis.current.keys('sessions:*').select { |key|
  # セッション情報の実態を取り出す
  user_hash = Marshal.load(Redis.current.get(key))
  # ユーザを特定
  user_hash["warden.user.#{mapping}.key"][0].include?(user_id)
rescue
  false
}.each { |key|
  # 特定したユーザのセッションを破棄
  Redis.current.del(key)
}

野蛮而不安全的感觉…执行时自负责任。

链接集

    • Device

 

    • Warden

RedisStore

Rails の session store を Redis に対応させるやつ

Redis

Ruby の Redis クライアント. RedisStoreはRedisとこれで通信してる

Marshal

RedisStoreは(昔の)デフォルトだとRedisに保存するデータを Marshal でシリアライズする

Marshal.load は未検証の値に使っちゃダメ。

[Rails] deviseのセッション(session)はどのように決められているのか – Qiita

Devise -> Warden のコードリーディングの記事。とてもわかりやすい

广告
将在 10 秒后关闭
bannerAds