我已經設置了一個Rails 5(5.0.0.rc1)應用程序,其標記爲--api
。它使用Warden進行身份驗證。在Warden驗證失敗後Rails日誌中沒有狀態碼
這一切都有效,除了當監獄認證失敗時,響應沒有被正確記錄。日誌看起來是這樣的:
Started GET "/widgets.json" for ::1 at 2016-06-14 11:38:20 +0000
Processing by WidgetsController#index as JSON
Completed in 0ms (ActiveRecord: 0.0ms)
,或者在生產:
I, [2016-06-14T14:12:54.938271 #17625] INFO -- : [db39f895-eeb1-4861-91d0-5d52c124e37a] Completed in 1ms (ActiveRecord: 0.0ms)
它當然應該說Completed 401 Unauthorized in...
,但無論出於何種原因,它不知道響應的狀態代碼。
監獄長身份驗證錯誤被髮送到一個機架兼容,ActionController::Metal
來源的控制器很簡單:
class UnauthorizedController < ActionController::Metal
include ActionController::Head
def self.call(env)
@respond ||= action(:respond)
@respond.call(env)
end
def respond
head :unauthorized
end
end
它使用的基本head
方法應對(無需渲染任何東西),因此推測它」 d的行爲與在常規Rails控制器中使用head
的行爲相同。但不是。
如果我嘗試使用redirect_to ...
或render ...
(包括相關模塊之後),會發生同樣的事情。因此,在Rack→Rails→Warden→Warden失敗應用程序(控制器)中的某處,響應的狀態代碼將丟失。日誌知道開始記錄請求,並知道它已被處理,因爲它顯然吐出了「Completed ...」 - 行。但是有些東西沒有正確的掛鉤。
有關如何解決此問題的任何想法?
你能否把你的應用程序最少的代碼GitHub上? Coz,通常的設置是'Rack→Warden→Rails',而不是'Rack→Rails→Warden'。 – Uzbekjon
@Uzbekjon完成。實際上,多少有一點準備好去。你可以在這裏找到它(https://github.com/Flambino/WardenLogging_Test)。是的,你所說的總是有意義的(畢竟它是中間件),所以很可能是我把所有東西都完全倒過來了。 – Flambino