Rails中的protect_from_forgery和verify_authenticity_token有什么区别?

What's the difference between protect_from_forgery and verify_authenticity_token in Rails?

我通常在我的 API 控制器中写 skip_before_action :verify_authenticity_token,但我刚刚发现还有一个选项 protect_from_forgery except :action。有什么区别,我应该在什么时候使用哪一个?

查看 protect_from_forgery 的代码,它是 verify_authenticity_tokenverify_same_origin_request 的包装器。

def protect_from_forgery(options = {})
  options = options.reverse_merge(prepend: false)

  self.forgery_protection_strategy = protection_method_class(options[:with] || :null_session)
  self.request_forgery_protection_token ||= :authenticity_token
  before_action :verify_authenticity_token, options
  append_after_action :verify_same_origin_request
end

我对 the docs 的理解是,您使用 protect_from_forgery 为 ApplicationController 中的所有控制器默认打开 CSRF。使用 skip_before_action :verify_authenticity_token 在子类中有选择地关闭它。