使用 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 のコードリーディングの記事。とてもわかりやすい