我有一个rails应用程序,我打算升级到rails 5.我正在使用devise(v4.2.0)和rails(v5.0.0)。正如设计README.md文件中所建议的那样,我尝试将proceed_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
答案 0 :(得分:67)
如Rails 5的Devise documentation注释中所示
对于Rails 5,请注意
protect_from_forgery
不再是前置的 到before_action
链,如果你设置了authenticate_user
在protect_from_forgery
之前,您的请求将导致&#34;无法解决 验证CSRF令牌真实性。&#34;要解决此问题,请更改 您调用它们的顺序,或使用protect_from_forgery prepend: true
。
答案 1 :(得分:11)
注意:虽然此答案具有预期效果,但它会降低整体安全性。 Alon的以下答案更为正确,并保持了网站的安全性。
gcc-c++
喜欢这个
答案 2 :(得分:3)
我最近以相当大的方式点击了这个,我发现我的错误是我的应用程序的域名最近发生了变化,但我忘了更新session_store.rb。这可能不是每个人的问题,但它会将此报告为CSRF错误。所以请查看config / session_store.rb
答案 3 :(得分:0)
我使用过这样的东西,对我有用。
class WelcomeController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_model!
end
答案 4 :(得分:0)
这个决定帮助了我。我[从这里] [1]做出了决定。就我而言,该主题的不幸名称使用了我没有到达的错误关键字,因此我将在此主题中给出,因为这是错误的确切名称。
就我而言,我将以下行“添加”到了application_controller.rb
文件中:
protect_from_forgery with:: null_session
有一种解决方案,它会将“ REPLACE”行protect_from_forgery with:: exception
(如果存在)说成我上面引用的那一行