问题描述
我在Devise中遇到了一个非常奇怪的问题。我设置了一个既接受get请求又发布post请求的路由。即时获取,显示表单,在帖子上,提交表单。
当我向该路线发送XHR帖子时,到达目的地时,它告诉我我尚未登录,并向我发送了未经授权的401。之后,我必须登录,然后再试一次。
我已经尝试解决了几个小时,我只能弄清楚我的控制器方法没有被调用。我在过滤器之前放入了自己的自定义身份验证,它只是确认在我的rails应用程序被调用时,该用户不再登录。
另外,如果我打开表格但不提交,我可以照常继续。在XHR的某个地方,它正在使设计退出我。
如果您有任何想法请帮忙,我不知道现在发生了什么...
谢谢
-斯科特
编辑:添加相关的代码
routes.rb
match \'projects/:p/fileBox\' => \'projects#show\',:via => [\"get\",\"post\"],:as => \'project_fileBox\'
projects_controller.rb
before_filter :authenticate_user! # <--- By the time this gets called,the user is logged out
def show
# ^^^^ Doesnt get called. Logger shows that it recognized route though
logger.debug \"-----------projects#show\"
logger.debug \"Current user logged in:\"+user_signed_in?.to_s
提交的表格
<form class=\"upload\" action=\"<%= project_fileBox_path(@project) %>?n=7&cType=<%= cType %>&fid=<%= fid %>\" method=\"post\" enctype=\"multipart/form-data\">
<input type=\"file\" name=\"file\" multiple/>
<button>Upload</button>
<div>Add / Drag Files To Upload</div>
</form>
上传XHR的Javascript
formDataUpload = function (files,xhr,settings) {
var formData = new FormData(),i;
$.each(getFormData(settings),function (index,field) {
formData.append(field.name,field.value);
});
for (i = 0; i < files.length; i += 1) {
formData.append(settings.fieldName,files[i]);
}
xhr.send(formData);
}
如果我错过了一些相关的代码,请告诉我
解决方法
除了JS之外,这里没有太多要做的事情了,但是您确实遇到了很大的改变,因为CSRF令牌没有被设置为请求的一部分。在各种Rails 3.0.x版本中,这已经发生了变化,因此即使没有代码也很难确定。
一个彻底的简单测试就是关闭CSRF(例如,从ApplicationController中删除protect_from_forgery)。如果可行,则您有答案,并且需要确保令牌被传递,否则您将进行伪造保护。
,当我在一个页面中有两个表单时,我遇到了同样的问题,其中一个表单发布到应用程序内的路由,另一表单发布到外部地址。 John Paul Ashenfelter是对的,它与JS无关。
像您一样,我不想为整个站点禁用CSRF。我最终对发布到控制器中异地地址的方法禁用了防伪保护:
protect_from_forgery :except => [:some_method]
并以创建此CSRF问题的形式出现:
<%= form_for :some_model,authenticity_token: false do%>