ruby-on-rails - 覆盖 Controller 中的 protect_from_forgery 策略

标签 ruby-on-rails ruby overriding csrf

我想使用两种不同的 protect_from_forgery 策略构建一个 Rails 应用程序:一种用于 Web 应用程序,一种用于 API。

在我的应用程序 Controller 中,我有这行代码:protect_from_forgery with: :exception 为了防止 CSRF 攻击,它工作得很好。

在我的 API 命名空间中,我创建了一个继承 self 的应用程序 Controller 的 api_controller,它是 API 命名空间中所有其他 Controller 的父类,我将上面的代码更改为: protect_from_forgery : null_session.

遗憾的是,我在尝试发出 POST 请求时遇到错误:“无法验证 CSRF token 真实性”。

我不想跳过我的 API Controller 中的 verify_authenticity_token 方法,我只想在我的应用程序中有两个不同的策略,那么如何覆盖我的应用程序 Controller 中定义的 protect_from_forgery 策略?

编辑:好的,所以我最终做了我一开始不想做的事情:更改我的 api_controller 的继承:它现在继承自 ActionController::Base,不再继承 self 的应用程序 Controller 。它现在确实有效,但是:

  1. 它没有回答我的问题,即覆盖 protect_from_forgery 策略。
  2. 它不是 DRY,因为我必须复制/粘贴之前在我的 application_controller 中的内容。

因此,如果有人有真正的方法来覆盖此方法,我将不胜感激。

最佳答案

如果您将 protect_from_forgery with: :exception 保留在应用程序 Controller 中,然后将以下内容放入 API Controller 中,会怎样?

skip_before_action :protect_from_forgery
protect_from_forgery with: :null_session

这样,您仍然可以为 Web 应用程序中的所有 Controller 获得标准的 CSRF 攻击保护,但您的 API 方法也可以获得空 session 行为。

关于ruby-on-rails - 覆盖 Controller 中的 protect_from_forgery 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23673040/

相关文章:

ruby-on-rails - 无法安装 pg gem os X 10.11.6、Rails 5、ruby 2.3

ios - 是否可以在没有继承的情况下覆盖类上的 drawRect?

ruby-on-rails - 在 High Sierra 上安装 Mysql 5.7

ios - 让服务器后端告诉 iOS 应用程序更新数据

当 gem 在 bundle exec 之外运行时,Ruby 未初始化常量错误

ruby-on-rails - 在 Rails 中处理带有 "action"参数的 POST

java - 方法重载和重写中的编译时和运行时绑定(bind)

c++ - 是否可以识别不需要的虚函数覆盖?

ruby-on-rails - 可以 rake db :schema:load without wiping the database

ruby-on-rails - 初学者问题: PUT update in a Rails view