2016-06-14 17 views
8

Ich habe eine Rails 5 (5.0.0.rc1) -App mit dem --api-Flag eingerichtet. Es verwendet Warden für die Authentifizierung.Kein Statuscode in Rails-Protokoll nach Warden-Auth-Fehler

Alles funktioniert, außer dass die Warden-Authentifizierung fehlschlägt, wird die Antwort nicht ordnungsgemäß protokolliert. Das Protokoll sieht wie folgt aus:

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) 

oder in der Produktion:

I, [2016-06-14T14:12:54.938271 #17625] INFO -- : [db39f895-eeb1-4861-91d0-5d52c124e37a] Completed in 1ms (ActiveRecord: 0.0ms) 

Es ist natürlich Completed 401 Unauthorized in... sein sollte sagen, aber aus irgendeinem Grund, es nicht den Statuscode der Antwort wissen.

class UnauthorizedController < ActionController::Metal 
    include ActionController::Head 

    def self.call(env) 
    @respond ||= action(:respond) 
    @respond.call(env) 
    end 

    def respond 
    head :unauthorized 
    end 
end 

Es ist mit dem Grund head Methode zu reagieren (keine Notwendigkeit zu machen alles), so vermutlich es:

Warden Authentifizierungsfehler auf ein Rack-kompatibel, werden ActionController::Metal-abgeleitetes Controller, die sehr einfach ist, gesendet d verhält sich genauso wie die Verwendung von head in einem normalen Rails-Controller. Aber nein.

Das Gleiche passiert, wenn ich versuche, redirect_to ... oder render ... (nach Einschluss der entsprechenden Module) zu verwenden. Irgendwo in der Rack → Rails → Warden → Warden Failure App (Controller) fehlt der Statuscode der Antwort. Das Protokoll kann die Anforderung protokollieren und weiß, dass es bearbeitet wurde, da es offensichtlich die Zeile "Abgeschlossen ..." ausspuckt. Aber etwas ist nicht richtig angeschlossen.

Irgendwelche Ideen, wie Sie das beheben können?

+0

Könnten Sie schieben Sie Ihren minimalen App-Code zu handhaben GitHub? Coz, das übliche Setup ist 'Rack → Warden → Rails' und nicht' Rack → Rails → Warden'. – Uzbekjon

+0

@ Usbekjon Fertig. Hatte einen mehr oder weniger bereit zu gehen, eigentlich. Sie finden es [hier] (https://github.com/Flambino/WardenLogging_Test). Und ja, was du sagst, macht total Sinn (es ist schließlich Middleware), also kann es gut sein, dass ich gerade alles komplett zurückgestellt habe. – Flambino

Antwort

2

Warden hat keinen rails Logger. Es wirft nur an exception and catch it, Warden eine Möglichkeit bietet, diese Ausnahme von before_failure Rückruf

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

Und was sagen die Protokolle? Weil das meine Frage ist. Mein Setup funktioniert bereits für die Authentifizierung usw., _except_ dass die Protokolle nicht anzeigen, welcher HTTP-Status an den Client gesendet wurde. Und das ist meine Frage – Flambino

+0

@Flambino Ich denke 'warden' ist nicht kompatibel mit' Schienen' (nur mit 'Rack'). Daher hat 'warden'' Rails.logger' nicht eingebettet. Versuchen Sie, 'before_failure' Callback zu verwenden (Ich habe meine Antwort bearbeitet) – itsnikolay

+0

Sicher, ich kann hinzufügen, jede zusätzliche Protokollierung möchte ich in einem Rückruf, aber ich bin interessiert an der Rails-Logger - die scheint, dass die Anfrage beantwortet wurde - um die Antwort auf die gleiche Weise wie jede andere Antwort zu protokollieren. – Flambino