我目前正在与其他几个开发人员一起开发Rails应用程序,通过AJAX向服务器发送帖子.有时,我们注意到我们的邮箱日志(log)中出现了InvalidAuthenticityToken个例外,这导致我们想要采取行动.

由于这个请求是通过Angular提交的,我认为我们将服务器视为一个API,应该使用protect_from_forgery with: :null_session.然而,protect_from_forgery with: :reset_session似乎为我们提供了同样的解决方案.

我不希望仅仅因为推荐就盲目地插入代码,所以我想知道这两种伪造保护方法之间的区别.什么时候我会使用其中一个而不是另一个,为什么我更喜欢使用它?

推荐答案

根据我对代码的解释,似乎:

  • null_session应该在API样式的控制器中使用,因为您不使用会话对象.这听起来是适合你的Angular应用的解决方案.用户先前存在的会话(即由其他传统控制器设置的会话)将保持不变.如果不将with选项指定为protect_from_forgery,这也是默认行为.
  • reset_session代表传统控制器.当CSRF判断失败时,它会告诉Rails取消用户的会话并继续处理请求.这听起来像是一种"偏执模式",在这种模式下,如果有任何证据表明请求被篡改,你就想让用户退出你的应用程序.

如果你的Rails应用程序根本不使用会话,那么这些会话是可以互换的.

然而,如果你确实在应用程序的某些部分使用了会话,而不是在其他部分(即传统和API控制器的混合),那么null_session可能是你应该使用的.否则,如果使用reset_session,浏览器发出的API请求将导致用户注销其浏览器会话.

Ruby-on-rails相关问答推荐

Rails 6升级没有加载Mongoid,这是一个问题

Rails文档的悲观锁定示例中的争用条件

Rails 7.1,登录到STDOUT和LOG/Production.log

是否从已转换为字符串的数组中提取符号?

无法在 Rails 中使用 wkhtmltopdf 写入临时文件

Ruby/Rails 相当于 Python 的 sys.addAuditHook

active_storage.resolve_model_to_route的不同值代表什么意思?

具有 IN 子句的参数化查询在 ruby​​-on-rails 的 blazer 工具中无法按预期工作

为什么 Image_tag 产生images/...而不是assets/....?

Rails 模型 - 以 ID 作为自定义列的自定义主键

Rails:如何访问 RESTful 助手?

在 factory_girl 中填充与 children 的关联

在 ruby​​ 中构建公钥时,是什么导致既不是 PUB key 也不是 PRIV key::nested asn1 错误?

连接表的最佳 SQL 索引

form_for 未定义的方法 `user_path'

Coffeescript ||= 模拟?

在创建控制器和模型之后(仅)创建 Ruby on Rails 视图

Rails - 如何在用户登录时覆盖设计 SessionsController 以执行特定任务?

在任何来源中都找不到 thread_safe-0.3.0

ActionMailer 在开发 Rails 4 中不发送邮件