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