跳至内容 跳至搜索
方法
P
S

实例公共方法

protect_from_forgery(options = {})

开启请求伪造保护。请注意,GET 和 HEAD 请求不会被检查。

class ApplicationController < ActionController::Base
  protect_from_forgery
end

class FooController < ApplicationController
  protect_from_forgery except: :index
end

您可以使用 skip_forgery_protection 在控制器上禁用伪造保护。

class BarController < ApplicationController
  skip_forgery_protection
end

有效选项

  • :only / :except - 仅对操作子集应用伪造保护。例如 only: [ :create, :create_all ]

  • :if / :unless - 根据传入的 Proc 或方法引用完全关闭伪造保护。

  • :prepend - 默认情况下,身份验证令牌的验证将添加到您应用程序中 protect_from_forgery 调用位置。这意味着之前添加的任何回调都会首先运行。当您希望伪造保护依赖于其他回调(如身份验证方法(Oauth 与 Cookie 身份验证))时,这很有用。

    如果需要将验证添加到回调链的开头,请使用 prepend: true

  • :with - 设置用于处理未验证请求的方法。请注意,如果 default_protect_from_forgery 为 true,Rails 会使用 with :exception 调用 protect_from_forgery

内置的未验证请求处理方法包括:* :exception - 抛出 ActionController::InvalidAuthenticityToken 异常。* :reset_session - 重置会话。* :null_session - 在请求期间提供一个空会话,但不会完全重置它。用作默认值,如果未指定 :with 选项。

您还可以为未验证的请求处理实现自定义策略类。

class CustomStrategy
  def initialize(controller)
    @controller = controller
  end

  def handle_unverified_request
    # Custom behavior for unverfied request
  end
end

class ApplicationController < ActionController::Base
  protect_from_forgery with: CustomStrategy
end
  • :store - 设置用于存储和检索 CSRF 令牌的策略。

内置的会话令牌策略包括:* :session - 在会话中存储 CSRF 令牌。用作默认值,如果未指定 :store 选项。* :cookie - 在加密的 Cookie 中存储 CSRF 令牌。

您还可以为 CSRF 令牌存储实现自定义策略类。

class CustomStore
  def fetch(request)
    # Return the token from a custom location
  end

  def store(request, csrf_token)
    # Store the token in a custom location
  end

  def reset(request)
    # Delete the stored session token
  end
end

class ApplicationController < ActionController::Base
  protect_from_forgery store: CustomStore.new
end
# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 197
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

  self.csrf_token_storage_strategy = storage_strategy(options[:store] || SessionStore.new)

  before_action :verify_authenticity_token, options
  append_after_action :verify_same_origin_request
end

skip_forgery_protection(options = {})

关闭请求伪造保护。这是 skip_forgery_protection 的包装器。

skip_before_action :verify_authenticity_token

请参阅 skip_before_action 以了解允许的选项。

# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 214
def skip_forgery_protection(options = {})
  skip_before_action :verify_authenticity_token, options.reverse_merge(raise: false)
end