Railsアプリケーションがあり、Rails 5.にアップグレードする予定です。Rails(v5.0.0)とともにdevise(v4.2.0)を使用しています。 devise README.mdファイルで提案されているように、protect_from_forgeryをbefore_filterの上に移動しようとしましたが、ログインまたはバグを更新しようとするとエラーActionController::InvalidAuthenticityToken
が発生します
私のApplication Controller
は
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception, prepend: true
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
devise_parameter_sanitizer.permit(:account_update, keys: [:name])
end
end
私の他のBugController
は
class BugsController < ApplicationController
protect_from_forgery prepend: true, with: :exception
before_action :authenticate_user!
before_action :set_bug, only: [:show, :edit, :update]
def update
respond_to do |format|
if @bug.update(bug_params)
format.html { redirect_to @bug, notice: 'Bug was successfully updated.' }
format.json { render :show, status: :ok, location: @bug }
else
format.html { render :edit }
format.json { render json: @bug.errors, status: :unprocessable_entity }
end
end
end
private
def bug_params
params.require(:bug).permit(:product, :component, :title, :description, :status_id, :created_by_id, :assigned_to_id)
end
end
注:この回答には望ましい効果がありますが、全体的なセキュリティが低下します。以下のアロンの回答はより正確で、サイトのセキュリティを維持しています。
class BugsController < ApplicationController
skip_before_filter :verify_authenticity_token
protect_from_forgery prepend: true, with: :exception
before_action :authenticate_user!
before_action :set_bug, only: [:show, :edit, :update]
end
このような
Devise documentation Rails 5の注意事項に示されているように
Rails 5の場合、
protect_from_forgery
はbefore_action
チェーンの前に追加されないため、authenticate_user
の前にprotect_from_forgery
を設定した場合、リクエストは「CSRFトークンの信頼性を検証できません」という結果になります。これを解決するには、呼び出す順序を変更するか、protect_from_forgery prepend: true
を使用します。
私は最近これをかなり大きな方法でヒットし、私のエラーは私のアプリケーションのドメイン名が最近変更されたことであることがわかりましたが、session_store.rbを更新するのを忘れていました。それはすべての人の問題ではないかもしれませんが、CSRFエラーとしてこれを報告します。 config/session_store.rbをチェックしてください
私はこのようなものを使用しましたが、それは私のために機能します。
class WelcomeController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_model!
end
この決定は私を助けました。 [ここから] [1]を決定しました。私と同じように、そのトピックの不幸な名前は、そこに到達しなかったエラーのキーワードを使用しているので、ここにエラーの正確な名前があるので、このスレッドで説明します。私の場合、次の行をapplication_controller.rb
ファイルに「追加」しました。
protect_from_forgery with:: null_session
「REPLACE」行protect_from_forgery with:: exception
が存在する場合は、上記で引用したものに対応するソリューションがあります