我想使用两种不同的 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 。它现在确实有效,但是:
- 它没有回答我的问题,即覆盖 protect_from_forgery 策略。
- 它不是 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/