[英]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.