LoginSignup
4
4

More than 3 years have passed since last update.

Devise (Warden) + Redis で管理してる Rails のセッションから特定ユーザのものを破棄する

Last updated at Posted at 2019-10-29

何がしたいか

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)
}

野蛮かつ不穏な感じ…実施は自己責任で。

リンク集

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4