2016-07-12 27 views
20

Tôi có một ứng dụng đường ray mà tôi đang lên kế hoạch nâng cấp lên đường ray 5. Tôi đang sử dụng devise (v4.2.0) cùng với đường ray (v5.0.0). Như đã đề cập trong devise tập tin README.md, tôi đã cố gắng di chuyển protect_from_forgery trên before_filter nhưng vẫn khi tôi đang cố gắng để đăng nhập hoặc cập nhật lỗi của tôi, tôi nhận được một lỗi ActionController::InvalidAuthenticityTokenRails 5 ActionController :: InvalidAuthenticityToken lỗi

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 

Và tôi khác 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 

Trả lời

10
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 

Giống như

này
+0

Tôi đã thử đặt 'skip_before_filter: verify_authenticity_token' trong bộ điều khiển lỗi nhưng vẫn không hoạt động. – HSD

+0

chỉ cho tôi nơi bạn đặt nó – Boltz0r

+0

Trong 'Bộ điều khiển lỗi'' protect_from_forgery prepend: true, với:: exception before_action: authenticate_user! before_action: set_bug, chỉ: [: show,: edit,: update] ' – HSD

46

Như đã nêu trong Devise documentation ghi chú cho Rails 5

Đối với Rails 5, lưu ý rằng protect_from_forgery không còn được thêm vào phía trước đến chuỗi before_action, vì vậy nếu bạn đã thiết lập authenticate_user trước protect_from_forgery, yêu cầu của bạn sẽ dẫn đến "Can 't xác minh tính xác thực của thẻ CSRF. " Để giải quyết vấn đề này, hãy thay đổi thứ tự mà bạn gọi cho họ hoặc sử dụng protect_from_forgery prepend: true.

+6

Điều này có vẻ như là một cách tốt hơn so với bỏ qua việc xác minh mã xác thực !! – Stephen

+1

Đây phải là câu trả lời được chọn – Tallboy

1

Tôi đã sử dụng một cái gì đó như thế này và nó hoạt động cho tôi.

class WelcomeController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_action :authenticate_model! 
end 
1

Gần đây tôi đã nhấn điều này theo cách khá lớn và tôi thấy rằng lỗi của tôi là tên miền của ứng dụng gần đây đã thay đổi nhưng tôi quên cập nhật session_store.rb. Đó có thể không phải là vấn đề của mọi người nhưng nó sẽ báo cáo điều này là lỗi CSRF. Vì vậy, hãy kiểm tra config/session_store.rb

Các vấn đề liên quan