J'ai une application Rails que je prévois de mettre à niveau vers Rails 5. J'utilise le système de développement (v4.2.0) avec Rails (v5.0.0). Comme suggéré dans le fichier README.md, j'ai essayé de déplacer le fichier protect_from_forgery au-dessus du fichier before_filter, mais quand j'essaie de me connecter ou de mettre à jour mon bogue, l'erreur ActionController::InvalidAuthenticityToken
s'affiche.
Mon Application Controller
est
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
Et mon autre BugController
est
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
Remarque : Bien que cette réponse produise l'effet escompté, elle réduit toutefois la sécurité globale. La réponse ci-dessous de Alon est plus correcte et maintient la sécurité du site.
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
Comme ça
Comme indiqué dans Devise documentation notes pour Rails 5
Pour Rails 5, notez que
protect_from_forgery
n'est plus ajouté au début à la chaînebefore_action
, donc si vous avez définiauthenticate_user
avantprotect_from_forgery
, votre demande entraînera "Impossible vérifier l'authenticité du jeton CSRF." Pour résoudre ce problème, changez le fichier ordre dans lequel vous les appelez, ou utilisezprotect_from_forgery prepend: true
.
J'ai récemment touché ce problème assez gros et j'ai constaté que mon erreur était que le nom de domaine de mon application avait récemment changé, mais j'ai oublié de mettre à jour session_store.rb. Ce n'est peut-être pas le problème de tout le monde, mais cela sera signalé comme une erreur CSRF. Alors s'il vous plaît vérifier config/session_store.rb
J'ai utilisé quelque chose comme ça et ça marche pour moi.
class WelcomeController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_model!
end
Cette décision m'a aidé. J'ai pris la décision [d'ici] [1]. tout comme pour moi, le nom malheureux de ce sujet, en utilisant les mots clés d'erreur que je n'ai pas compris, je vais donc vous donner dans ce fil, car voici le nom exact de l'erreur ... dans mon cas, J'ai "ajouté" la ligne suivante au fichier application_controller.rb
:
protect_from_forgery with:: null_session
il y a une solution où il est écrit "REPLACE" la ligne protect_from_forgery with:: exception
, si elle existe, à celle que j'ai citée ci-dessus