前提
name
email
password
の3つでログインします。
deviseを複数モデルで使用している為、devise.rbの編集ではなく、modelsでauthentication_keys
の設定をしています。
他モデルはログイン条件の違いからからか希望の挙動をしています。
実現したいこと
他モデル同様recaptchaを挟みたい!
発生している問題・ログ
verify_recaptchaのチェックをスルーしてsign_in, sign_upできてしまう。
問題のモデル Started POST "/masters/sign_in" for ::1 at 2022-11-13 17:59:23 +0900 Processing by Devise::SessionsController#create as HTML Parameters: {"authenticity_token"=>"j7z8s9+ADT/88sdsdAT2SkTBBHrHF/uG/d+5iUtwQVNd4OlATlz3QZToe7ybnitE2NjnjfYqReuov6Et/CpbmA==", "master"=>{"name"=>"", "email"=>"", "password"=>"[FILTERED]"}, "g-recaptcha-response"=>"", "commit"=>"ログイン"} Completed 401 Unauthorized in 3ms (ActiveRecord: 0.0ms | Allocations: 839) Processing by Devise::SessionsController#new as HTML Parameters: {"authenticity_token"=>"j7z8s9+ADT/88sdsdAT2SkTBBHrHF/uG/d+5iUtwQVNd4OlATlz3QZToe7ybnitE2NjnjfYqReuov6Et/CpbmA==", "master"=>{"name"=>"", "email"=>"", "password"=>"[FILTERED]"}, "g-recaptcha-response"=>"", "commit"=>"ログイン"} Rendering masters/sessions/new.html.erb within layouts/application Rendered masters/sessions/new.html.erb within layouts/application (Duration: 0.8ms | Allocations: 664) [Webpacker] Everything's up-to-date. Nothing to do Rendered layouts/_global_navi.html.erb (Duration: 0.5ms | Allocations: 530) Completed 200 OK in 7ms (Views: 6.0ms | ActiveRecord: 0.0ms | Allocations: 5693)
正常なモデル Started POST "/patients/sign_in" for ::1 at 2022-11-13 17:58:35 +0900 Processing by Patients::SessionsController#create as HTML Parameters: {"authenticity_token"=>"ibh/1MPNxpNxjAq4UsYqV1WuE99zlup1fq/Y/h0RPhRb5GonUhE87RmWtmi9XPdZybfwKEKrVBgrz8Baqksk3w==", "patient"=>{"email"=>"", "password"=>"[FILTERED]", "remember_me"=>"0"}, "g-recaptcha-response"=>"", "commit"=>"ログイン"} Rendering patients/sessions/new.html.erb within layouts/application Rendered patients/shared/_links.html.erb (Duration: 1.4ms | Allocations: 289) Rendered patients/sessions/new.html.erb within layouts/application (Duration: 11.9ms | Allocations: 1546) [Webpacker] Everything's up-to-date. Nothing to do Rendered layouts/_global_navi.html.erb (Duration: 5.1ms | Allocations: 571) Filter chain halted as :check_captcha_sign_in rendered or redirected Completed 200 OK in 46ms (Views: 30.8ms | ActiveRecord: 0.0ms | Allocations: 8471)
問題の方ではProcessing...
が2回走っている。(authentication_keysを2つ設定しているから?)
理想の挙動ではRendered...
の後にFilter chain...
が走っている。
該当のソースコード
(app/models/master.rb) class Master < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :confirmable, :lockable, :timeoutable, :trackable, authentication_keys: %i[name email] private # def email_required? # false # end # def _changed? # false # end # def will_save_change_to_email? # false # end end
(app/controllers/masters/registrations_controller.rb) # frozen_string_literal: true class Masters::RegistrationsController < Devise::RegistrationsController prepend_before_action :check_captcha_sign_up, only: [:create] before_action :configure_sign_up_params, only: [:create] before_action :configure_account_update_params, only: [:update] protected def configure_sign_up_params devise_parameter_sanitizer.permit(:sign_up, keys: %i[name email password password_confirmation]) end def configure_account_update_params devise_parameter_sanitizer.permit(:account_update, keys: %i[name email password password_confirmation]) end private def check_captcha_sign_up unless verify_recaptcha(message: t('message.verification_failed')) self.resource = resource_class.new sign_up_params resource.validate set_minimum_password_length respond_with_navigational(resource) { render :new } end end end
(app/controllers/masters/sessions_controller.rb) # frozen_string_literal: true class Masters::SessionsController < Devise::SessionsController prepend_before_action :check_captcha_sign_in, only: [:create] before_action :configure_sign_in_params, only: [:create] protected def configure_sign_in_params binding.irb devise_parameter_sanitizer.permit(:sign_in, keys: %i[name email]) end private def check_captcha_sign_in binding.irb unless verify_recaptcha(message: t('message.verification_failed')) self.resource = resource_class.new sign_in_params resource.validate set_minimum_password_length respond_with_navigational(resource) { render :new } end end end
試したこと
deviseの公式リファレンスでauthentication_keysにloginという変数を用意するやり方など記載ありましたが、それはusernameかemailどちらかを入力するもので、今回は該当せず。
補足情報(FW/ツールのバージョンなど)
rails (6.0.6)
ruby 2.6.5
devise (4.8.1)
行き詰まってしまったのでご意見頂けますと幸いです。
あなたの回答
tips
プレビュー