Rails 5 ActionController::InvalidAuthenticityToken 错误
Rails 5 ActionController::InvalidAuthenticityToken error
我有一个 rails 应用程序,我打算将其升级到 rails 5. 我正在使用 devise(v4.2.0) 和 rails(v5.0.0)。正如设计 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
注意:虽然这个答案具有预期的效果,但它通过降低整体安全性来实现。 Alon 的以下回答更正确,并维护了站点的安全性。
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
For Rails 5, note that protect_from_forgery
is no longer prepended
to the before_action
chain, so if you have set authenticate_user
before protect_from_forgery
, your request will result in "Can't
verify CSRF token authenticity." To resolve this, either change the
order in which you call them, or use protect_from_forgery prepend:
true
.
我用过类似的东西,它对我有用。
class WelcomeController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_model!
end
我最近在相当大的程度上遇到了这个问题,我发现我的错误是我的应用程序的域名最近发生了变化,但我忘了更新 session_store.rb。这可能不是每个人的问题,但它会将此报告为 CSRF 错误。所以请查看 config/session_store.rb
这个决定帮助了我。我 [从这里] [1] 做出了决定。就像我一样,那个主题的不幸名称,使用错误的关键字我没有到达那里,所以我会在这个线程中给出,因为这里是错误的确切名称。
在我的例子中,我 "added" application_controller.rb
文件的以下行:
protect_from_forgery with:: null_session
有一个解决方案,它说 "REPLACE" 行 protect_from_forgery with:: exception
,如果它存在,到我上面引用的那个
[1]:Rails 4 Authenticity Token
我有一个 rails 应用程序,我打算将其升级到 rails 5. 我正在使用 devise(v4.2.0) 和 rails(v5.0.0)。正如设计 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
注意:虽然这个答案具有预期的效果,但它通过降低整体安全性来实现。 Alon 的以下回答更正确,并维护了站点的安全性。
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
For Rails 5, note that
protect_from_forgery
is no longer prepended to thebefore_action
chain, so if you have setauthenticate_user
beforeprotect_from_forgery
, your request will result in "Can't verify CSRF token authenticity." To resolve this, either change the order in which you call them, or useprotect_from_forgery prepend: true
.
我用过类似的东西,它对我有用。
class WelcomeController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_model!
end
我最近在相当大的程度上遇到了这个问题,我发现我的错误是我的应用程序的域名最近发生了变化,但我忘了更新 session_store.rb。这可能不是每个人的问题,但它会将此报告为 CSRF 错误。所以请查看 config/session_store.rb
这个决定帮助了我。我 [从这里] [1] 做出了决定。就像我一样,那个主题的不幸名称,使用错误的关键字我没有到达那里,所以我会在这个线程中给出,因为这里是错误的确切名称。
在我的例子中,我 "added" application_controller.rb
文件的以下行:
protect_from_forgery with:: null_session
有一个解决方案,它说 "REPLACE" 行 protect_from_forgery with:: exception
,如果它存在,到我上面引用的那个
[1]:Rails 4 Authenticity Token