尝试销毁对象时设计注销(Rails 3.0.5和Devise 1.1.8)

Dar*_*evo 7 ruby-on-rails devise

我升级到Rails 3.0.5和Devise 1.1.8.当我尝试删除任何对象时(通过带有:remote => true的视图),我得到一个身份验证对话框,并且销毁了Devise会话.然后,我必须再次登录,对象仍在那里......其他人是否有这个问题?关于如何解决它的任何想法?

非常感谢你.

Yur*_*huk 16

这个问题与Devise无关.简而言之,自从Rails 3.0.4以来,每个非GET请求都需要具有CSRF令牌,否则会话被清除.

此修复程序有两个主要更改,CSRF保护失败时的行为已更改,现在所有非GET请求都需要令牌.

应用此修补程序失败后,CSRF请求将不再生成HTTP 500错误,而是会重置会话.用户可以通过在自己的控制器中覆盖handle_unverified_request来覆盖此行为.

更多细节在这里:http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails

用于AJAX请求的jQuery代码段

$(document).ajaxSend(function(e, xhr, options) {
  var token = $("meta[name='csrf-token']").attr("content");
  xhr.setRequestHeader("X-CSRF-Token", token);
});
Run Code Online (Sandbox Code Playgroud)

如果您正在使用原型,则需要以下代码:

Ajax.Responders.register({
  onCreate: function(request) {
    var csrf_meta_tag = $$('meta[name=csrf-token]')[0];

    if (csrf_meta_tag) {
      var header = 'X-CSRF-Token',
          token = csrf_meta_tag.readAttribute('content');

      if (!request.options.requestHeaders) {
        request.options.requestHeaders = {};
      }
      request.options.requestHeaders[header] = token;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)