パスワードリセット後の自動サインインをカスタマイズ可能に
Deviseに、パスワードリセット後の自動サインイン動作をオーバーライド可能な sign_in_after_reset_password? メソッドが追加されました。これにより、コントローラ全体をコピーすることなく、サインイン動作を柔軟にカスタマイズできるようになります。
背景
従来の PasswordsController では、パスワードリセット後の自動サインイン判定が resource_class.sign_in_after_reset_password の直接参照によって行われていました。この動作をカスタマイズするには、コントローラ全体を継承してロジックを書き換える必要がありました。#5826 では、RegistrationsControllerに存在する sign_in_after_change_password? フックと同様の仕組みをPasswordsControllerにも導入しています。
この変更は、特定のフローで自動サインインの可否を動的に制御したいケースに対応するものです。PR作成者は、カスタムフローの実装において、コントローラのコードブロック全体をコピーすることなく動作を変更できる必要性を挙げています。
技術的な変更
PasswordsController の update アクションと after_resetting_password_path_for メソッドにおいて、resource_class.sign_in_after_reset_password の直接参照が新しい sign_in_after_reset_password? メソッドの呼び出しに置き換えられました。
変更前:
if resource_class.sign_in_after_reset_password
flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
set_flash_message!(:notice, flash_message)
resource.after_database_authentication
sign_in(resource_name, resource)
else
set_flash_message!(:notice, :updated_not_active)
end
変更後:
if sign_in_after_reset_password?
flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
set_flash_message!(:notice, flash_message)
resource.after_database_authentication
sign_in(resource_name, resource)
else
set_flash_message!(:notice, :updated_not_active)
end
新しく追加された sign_in_after_reset_password? メソッドは protected スコープで定義され、デフォルトでは元の設定値を返します:
# Check if the user should be signed in automatically after resetting the password.
def sign_in_after_reset_password?
resource_class.sign_in_after_reset_password
end
このメソッドをオーバーライドすることで、リクエストごとの条件判定や外部サービスとの連携など、動的な制御が可能になります。
設計判断
メソッド抽出によるカスタマイズポイントの明示化 という方針が採用されました。
sign_in_after_reset_password? は protected スコープに配置され、ユーザーがオーバーライド可能であることを明示しています。一方で、同じPRで変更された RegistrationsController の update_needs_confirmation? メソッドは private スコープに移動されました。これは、このメソッドがDevise内部での使用を意図しており、実質的な動作変更がフラッシュメッセージのみであるためです。
この protected / private の使い分けにより、ユーザーが安全にオーバーライドできるポイントと、内部実装として扱うべきポイントが明確に区別されています。RegistrationsControllerの既存の sign_in_after_change_password? フックとの一貫性も保たれており、Deviseのコントローラカスタマイズパターンが統一されています。
まとめ
本PRは、既存の設定値参照をメソッド呼び出しに置き換えるリファクタリングを通じて、パスワードリセット後の動作をカスタマイズ可能にした変更です。protected スコープの採用により、ユーザーはコントローラの継承だけでサインイン判定ロジックを差し替えられるようになり、Deviseのコントローラカスタマイズパターンの一貫性も向上しています。