Deviseでサインイン後に新しいsession idを取得する
deviseのcontrollerでログイン処理を書く時、
sign_in(user)
しても、sessionのidは更新されません。
actionの処理を抜けると初めて更新されます。
調べてるとこれが出てきました。
stackoverflow.com
で、この記事が参照してるのがこちら。
stackoverflow.com
2つの記事をまとめるとこんな感じ
class SessionsController < Devise::SessionsController
def create
self.resource = warden.authenticate!
sign_in(resource_name, resource)
commit_session_now!
render json: { session_id: session.id }
end
private
def commit_session_now!
return unless request.session_options[:renew]
session_data = session.to_hash.delete_if { |_k, v| v.nil? }
session_store.send(:set_session, env, session_id, session_data, request.session_options)
request.session_options[:renew] = false
request.session_options[:id] = session_id
end
def session_store
@session_store ||= request.session_options.instance_variable_get('@by')
end
def env
@env ||= request.session_options.instance_variable_get('@env')
end
def session_id
@session_id ||= session_store.send(:destroy_session, env, session.id || session_store.generate_sid, request.session_options)
end
end
採用すべきでないやり方ですが、こんなのもありました。
319ring.net
おまけ
Railsガイドのセキュリティ対策に関するページ。
読み応えありますね。
Railsのセキュリティ | Rails日本語ドキュメント | Ruby STUDIO