繁体   English   中英

Devise 在发布到不同路线时被注销

[英]Devise being logged out on post to different route

我对 Devise 有一个非常奇怪的问题。 我设置了一个接受 get 和 post 请求的路由。 在获取时,它会显示表单,在发布时,它会提交它。

当我向路由发送 XHR 帖子时,当它到达那里时,它告诉我我没有登录,并向我发送未经授权的 401。 之后我必须登录,然后我可以再试一次。

我已经尝试了好几个小时了,我所能弄清楚的是我的 controller 方法没有被调用。 我在过滤器之前放入了我自己的自定义身份验证,它只是确认当我的 rails 应用程序被调用时,用户不再登录。

另外,如果我打开表格但不提交,我可以照常继续。 在那个 XHR 的某个地方,它让 devise 让我退出。

如果你有任何想法请帮忙,我不知道现在发生了什么......

谢谢

-斯科特

编辑:添加相关的代码

路线.rb

match 'projects/:p/filebox' => 'projects#show', :via => ["get","post"], :as => 'project_filebox'

项目控制器.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 之外,这里的 go 并没有那么多,但是你遇到了一个非常强烈的变化,因为 CSRF 令牌没有被设置为你的请求的一部分。 这在各种 Rails 3.0.x 版本中发生了变化,所以如果没有代码就很难确定。

一个非常简单的测试是关闭 CSRF(例如从 ApplicationController 中删除protect_from_forgery)。 如果它有效,您就有了答案,并且需要确保令牌被传递,否则您将处理伪造保护。

当我在一页中有两个 forms 时遇到了同样的问题,其中一个发布到应用程序内的路由,另一个发布到外部地址。 John Paul Ashenfelter 说得对,它与 JS 无关。

和你一样,我不想为整个站点禁用 CSRF。 我最终为发布到 controller 中的场外地址的方法禁用了防伪保护:

protect_from_forgery :except => [:some_method]

并以创建此 CSRF 问题的形式:

<%= form_for :some_model, authenticity_token: false do%>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM