2016-06-14 36 views
8

我已經設置了一個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 ...」 - 行。但是有些東西沒有正確的掛鉤。

有關如何解決此問題的任何想法?

+0

你能否把你的應用程序最少的代碼GitHub上? Coz,通常的設置是'Rack→Warden→Rails',而不是'Rack→Rails→Warden'。 – Uzbekjon

+0

@Uzbekjon完成。實際上,多少有一點準備好去。你可以在這裏找到它(https://github.com/Flambino/WardenLogging_Test)。是的,你所說的總是有意義的(畢竟它是中間件),所以很可能是我把所有東西都完全倒過來了。 – Flambino

回答

2

守望者沒有rails記錄器。它只是拋出an exception and catch it, 監獄長提供了一種通過before_failure回調來處理這個異常

# config/inializers/warden_config.rb 
Warden::Manager.before_failure do |env, opts| 
    Rails.logger.info("401 Unuthorized") 
end 
+0

日誌說什麼?因爲這是我的問題。我的設置已經適用於身份驗證等,除了日誌不顯示發送給客戶端的http狀態。這就是我的問題 – Flambino

+0

@Flambino我認爲'warden'與'rails'不兼容(只有'rack')。因此'warden'沒有內嵌'Rails.logger'。嘗試使用'before_failure'回調(我已經編輯了我的答案) – itsnikolay

+0

當然,我可以在回調中添加任何我想要的日誌記錄,但我對使用Rails記錄器感興趣 - 似乎意識到請求已被響應以與任何其他響應相同的方式記錄響應。 – Flambino