Rails 4中的null_session和reset_session有什么区别?

Mak*_*oto 34 ruby ruby-on-rails angularjs

我目前正在与其他一些开发人员一起开发Rails应用程序,并且通过Angular通过AJAX对服务器进行了POST.有时,我们注意到InvalidAuthenticityToken我们的电子邮件日志中出现了一些例外情况,这导致我们希望采取行动.

由于此请求是通过Angular发出的,我的信念是我们将服务器视为API,我们应该使用它protect_from_forgery with: :null_session.但是,protect_from_forgery with: :reset_session似乎为我们提供了相同的分辨率.

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

Mat*_*son 50

基于我对代码的解释,似乎:

  • null_session应该在API样式的控制器中使用,在那里你没有使用会话对象.这听起来像是适用于Angular应用程序的解决方案.用户的预先存在的会话(即由其他传统控制器设置)将保持不变.如果您未指定with选项,它也是默认行为protect_from_forgery.
  • reset_session适用于传统控制器.当CSRF检查失败时,它会告诉Rails吹走用户的会话并继续处理请求.这听起来像一个"偏执模式",如果有任何篡改请求,您希望将用户从您的应用程序中注销.

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

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

  • 我认为`null_session`是默认的(不是上面的`reset_session`),根据这些文档:http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html (3认同)