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

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

リンク集