本記事は、以下ブログに投稿した記事のクロス投稿となります。
https://lanchester-tech-blog.hatenablog.com/entry/2019/10/15/135357
特定のコントローラで検証を無効化する
skip_forgery_protection
を使います。
これは skip_before_action :verify_authenticity_token
のラッパーなので only: :create
等のオプションを指定できます。
class ApplicationController < ActionController::Base
skip_forgery_protection
end
大本のコントローラで指定して継承先のコントローラで重複して使用はできないので、その場合は protect_from_forgery with: :exception
等を明示的に指定します。
class ArticleController < ApplicationController
protect_from_forgery with: :exception, only: :create
def create
# ...
end
end
検証を完全に無効化する
検証そのものを行わないようにします。
config.action_controller.allow_forgery_protection = false
警告だけを消す
検証は行って WARN
のログは出さないようにします。
config.action_controller.log_warning_on_csrf_failure = false
Rails 5.2 や 6 以降で null_session
rails 5.2 以降はデフォルトで protect_from_forgery with: :exception
となるような変更(https://github.com/rails/rails/commit/ec4a836919c021c0a5cf9ebeebb4db5e02104a55)が入り、ApplicationController
からは protect_from_forgery
の記述が消されました。
ApplicationController
に protect_from_forgery null: :session
としても反映されないので以前のように with: :null_session
を使いたい場合は以下のようにします。
config.action_controller.default_protect_from_forgery = false
class ApplicationController < ActionController::Base
# protect_from_forgery に with オプションを渡さない場合は with: :null_session と同等
protect_from_forgery
end