Closed29

devise で未ログイン時の redirect 動作を調べて挙動を変更したい

snakasnaka

やりたいこと

  • Redirect 時に Cache-Control ヘッダを明示的に指定したい
  • 未ログイン時に Redirect している箇所を調べる
    • リダイレクト先は ApplicationControllerafter_sign_out_path_for メソッドでオーバーライド可能
  • redirect の動作を変更したい

わかったこと

  • Devise における未ログイン時の Redirect の動作は Warden の failure_app の仕組みで行っている

  • Devise はデフォルトの failure_app として Devise::FailureApp を用意している

  • Devise の設定で failure_app を差し替えることができる

    config/initializers/devise.rb
    config.warden do |manager|
      manager.failure_app = CustomFailure
    end
    
    lib/custom_failure.rb
    class CustomFailure < Devise::FailureApp
      # redirect メソッドをオーバーライドして処理を追加する、追加した処理の後に元の redirect メソッドを呼び出す
      def redirect
        Rails.logger.debug("#### CustomFailure redirect ####")
        super
      end
    end
    
snakasnaka
snakasnaka

sign_out_and_redirect を呼び出してる箇所が見当たらない...?

snakasnaka

アプリケーションコードに respond_to_on_destroy をオーバーライドした箇所があった

format.any(*navigational_formats) { redirect_to after_sign_out_path_for(resource_name) }
snakasnaka

ログアウト時にはオーバライドしたコードが実行されていることを確認した

snakasnaka

ログイン前にアクセスしたときのリダイレクトを実行している箇所が知りたい

snakasnaka

Devise 思い出してきた
before_action :authenticate_user! で、未ログイン時のリダイレクトが動いていた記憶ある

snakasnaka
lib/custom_failure.rb
class CustomFailure < Devise::FailureApp
  # redirect メソッドをオーバーライドして処理を追加する、追加した処理の後に元の redirect メソッドを呼び出す
  def redirect
    Rails.logger.debug("#### CustomFailure redirect ####")
    super
  end
end
config/initializers/devise.rb
  config.warden do |manager|
    manager.failure_app = CustomFailure
  end

これで未ログイン時に独自の処理 Rails.logger.debug("#### CustomFailure redirect ####") が動くことを確認した

snakasnaka

試しに以下のようにしてみた

class CustomFailure < Devise::FailureApp
  # リダイレクトのレスポンスをキャッシュさせないようにする
  def redirect
    response.cache_control[:private] = true
    response.cache_control[:no_store] = true

    super
  end
end
このスクラップは2023/12/19にクローズされました