Rails 5 ActionController:: Ошибка InvalidAuthenticityToken
У меня есть приложение rails, которое я планирую обновить до рельсов 5. Я использую devise (v4.2.0) вместе с rails (v5.0.0). Как было предложено в файле README.md, я попытался переместить защиту_from_forgery выше before_filter, но все же, когда я пытаюсь войти или обновить свою ошибку, я получаю сообщение об ошибке ActionController::InvalidAuthenticityToken
My 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
Ответы
Ответ 1
Примечание. Хотя этот ответ имеет желаемый эффект, он снижает его общую безопасность. Приведенный ниже ответ от 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
Как это
Ответ 2
Как указано в Разработать документацию для Rails 5
Для Rails 5 обратите внимание, что protect_from_forgery
больше не добавляется к цепочке before_action
, поэтому, если вы установили authenticate_user
до protect_from_forgery
, ваш запрос приведет к ошибке "Can not проверить подлинность CSRF-маркера". Чтобы решить эту проблему, измените порядок, в котором вы их называете, или используйте protect_from_forgery prepend:
true
.
Ответ 3
Недавно я ударил это довольно просто, и я обнаружил, что моя ошибка была недавно изменена моим доменным именем приложения, но я забыл обновить session_store.rb. Это может быть не проблема каждого, но она сообщит об этом как ошибку CSRF. Поэтому, пожалуйста, проверьте config/session_store.rb
Ответ 4
Я использовал что-то вроде этого, и это работает для меня.
class WelcomeController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_model!
end
Ответ 5
Это решение помогло мне. Я принял решение [отсюда] [1]. Как и для меня, неудачное название этой темы с использованием ключевых слов об ошибке, которых я не получил, поэтому я приведу в этой теме, потому что здесь точное имя ошибки. в моем случае я "добавил" следующую строку в файл application_controller.rb
:
protect_from_forgery with:: null_session
есть решение, в котором говорится "ЗАМЕНИТЕ" строку protect_from_forgery with:: exception
, если оно существует, к тому, которое я цитировал выше
[1]: Жетон аутентичности Rails 4