38 lines
1.2 KiB
Ruby
38 lines
1.2 KiB
Ruby
module ApplicationCable
|
||
class Connection < ActionCable::Connection::Base
|
||
identified_by :current_user
|
||
|
||
def connect
|
||
self.current_user = find_verified_user
|
||
end
|
||
|
||
private
|
||
def find_verified_user
|
||
# セッションからuser_idを取得してUserを特定する
|
||
# 注: セッションストアの設定に依存するが、CookieStore(デフォルト)を想定
|
||
|
||
if verified_user = User.find_by(id: session_user_id)
|
||
verified_user
|
||
else
|
||
reject_unauthorized_connection
|
||
end
|
||
end
|
||
|
||
def session_user_id
|
||
# RailsのセッションCookieからuser_idを復元する
|
||
# _dip_front_session は config/initializers/session_store.rb で設定されているキー名、またはデフォルトの _app_session
|
||
# ここでは汎用的に取得を試みる
|
||
|
||
session_key = Rails.application.config.session_options[:key]
|
||
encrypted_session = cookies.encrypted[session_key]
|
||
|
||
if encrypted_session && encrypted_session["user_id"]
|
||
encrypted_session["user_id"]
|
||
else
|
||
# デバッグ用: 認証失敗時はnilを返す
|
||
nil
|
||
end
|
||
end
|
||
end
|
||
end
|