Devise (Warden) + Redis で管理してる Rails のセッションから特定ユーザのものを破棄する
何がしたいか
session_store に Redis かつ Devise で認証を管理してる Rails アプリの特定ユーザのセッションをすべて破棄したい。
どうやるか
セッションストアから対象ユーザのセッション情報を割り出して削除すれば良い。
Railsはセッションストアに sessions:session_id
(session_idはRailsが発行したsession_id) ってキーでセッション情報を保持する。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 のコードリーディングの記事。とてもわかりやすい
- Rails の session store を Redis に対応させるやつ
- Ruby の Redis クライアント. RedisStoreはRedisとこれで通信してる
- RedisStoreは(昔の)デフォルトだとRedisに保存するデータを Marshal でシリアライズする
-
Marshal.load
は未検証の値に使っちゃダメ。
- Devise -> Warden のコードリーディングの記事。とてもわかりやすい
Author And Source
この問題について(Devise (Warden) + Redis で管理してる Rails のセッションから特定ユーザのものを破棄する), 我々は、より多くの情報をここで見つけました https://qiita.com/oieioi/items/0aa5b0cfe65a872c2475著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .