2010-02-11 10 views
8

Meine Django-App, die in mod_wsgi unter Apache mit dem Standard-WSGIHandler von Django implementiert wurde, authentifiziert Benutzer über Formularanmeldung auf der Django-Seite. Also für Apache ist der Benutzer anonym. Dies macht das Apache-Zugriffsprotokoll weniger nützlich.WSGI/Django: Benutzername zurück an Apache für Zugriffsprotokoll übergeben

Gibt es eine Möglichkeit, den Benutzernamen nach der Verarbeitung der Anfrage über den WSGI-Wrapper an Apache zurückzugeben, sodass er im Apache-Zugriffsprotokoll angezeigt wird?

(Versionen: Django 1.1.1, mod_wsgi 2.5, Apache 2.2.9)

+0

Dies ist nicht trivialerweise soweit ich weiß, ich werde sehr interessiert sein, wenn eine gültige Antwort gepostet wird. Ich habe Apache Auth für meine Zwecke verwendet. – MattH

+0

Dies erwies sich in nginx als trivial möglich: app setzt einen Response-Header; nginx enthält das im Zugriffsprotokoll über ['log_format'] (http://wiki.nginx.org/HttpLogModule#log_format) und löscht es, bevor es über [' uwsgi_hide_header'] an den Client gesendet wird (http: //wiki.nginx .org/HttpUwsgiModule # uwsgi_hide_header) –

+0

Gibt es auch eine Lösung für Apache? – mynameistechno

Antwort

4

Sie können dies nur tun, wenn Sie den eingebetteten Modus verwenden und nur, wenn Sie ein separates Paket namens apswigpy verwenden, das eine Python-Bindung für das ursprüngliche Apache-Anforderungsobjekt bereitstellt. Das mod_wsgi-Paket bietet einen optionalen Mechanismus, mit dem das ursprüngliche Apache-Anforderungsobjekt als Python-CObject-Referenz in der WSGI-Umgebung übergeben werden kann. Sie verwenden, die in Verbindung mit apswigpy so etwas wie:

from apache.httpd import request_rec 
r = request_rec(environ['apache.request_rec']) 
r.user = user 

Zumindest glaube ich das wird Setup die entsprechenden Informationen, die Protokollierung zugreifen können dann verwendet werden.

Sie sollten diese Diskussion wirklich zur mod_wsgi Mailingliste führen.

+0

Danke; Ich habe dort einen Thread gestartet und akzeptiere diese Antwort als die nächste, die wir wahrscheinlich hier bekommen. :) –

+0

Hat sich die Diskussion dort etwas Besseres einfallen lassen? –

1

Dies ist wahrscheinlich nicht das, was Sie erwarten, aber man konnte den Benutzernamen in der URL-Schema verwenden. Auf diese Weise befindet sich der Benutzer im Pfadbereich Ihrer Apache-Protokolle.

Sie müssten Ihre Authentifizierung so ändern, dass auth erforderliche Antworten in den Apache-Protokollen offensichtlich sind. Andernfalls können Sie beim Anzeigen der Protokolle nicht authentifizierte Anfragen authentifizierten Benutzern zuordnen. Z.B. eine temporäre Weiterleitung an die Anmeldeseite zurückgeben, wenn die Anfrage nicht authentifiziert ist.

+0

Login-Ansicht umleiten zu/logged/ umleiten zu settings.LOGIN_REDIRECT_URL. Es ist hacky, aber ich mag es. – muhuk

+0

Sie haben Recht - nicht was ich erwarte. :) Benutzername in der URL ist nicht akzeptabel für mich. –

3

Sie könnten mod_auth_tkt verwenden. Ein auth_tkt ist ein signiertes Cookie mit der Benutzer-ID, die Apache verstehen kann. Ihre Webanwendung müsste set the cookie sein, wenn sich der Benutzer an- und abmeldet. Apache kann REMOTE_USER aus dem Cookie ableiten, es an Ihre Web-App oder eine Nicht-Django-Webanwendung, die auf demselben Server läuft, übergeben, es in Logs aufnehmen, was auch immer.

+0

Klingt nach dem * hust * ticket. Eine geringfügige Schwierigkeit könnte die Bindung an die IP sein, die hinter Lasten-ausgeglichenen Proxies Probleme verursachen könnte. Auch kann es schwierig sein, Ihre Bewerbung zu revertieren. – MattH

+0

Nein, es verursacht keine Probleme. Der Cookie ist optional an die IP-Adresse des entfernten Benutzers gebunden. Sie können dies mit einer X-Kopfzeile oder auf andere Weise übergeben, je nach Art Ihres Proxys. – joeforker

+0

Dies scheint tatsächlich eine ziemlich saubere Lösung; ermöglicht die Einzelanmeldung mit anderen Apps. Außerdem würde es möglich sein, den Zugriff auf statische Medien, die nicht von mod_wsgi behandelt werden, zu protokollieren (und zu kontrollieren). keine große Sache für uns, aber ein schöner Zusatznutzen. Vielen Dank! –

1

Korrigieren Sie mich, wenn ich falsch liege, aber was Sie daran hindert, eine benutzerdefinierte Middleware zu erstellen, die ein Cookie gleich dem Anzeigenamen des angemeldeten Benutzers setzt. Diese Middleware wird auf jeder Ansicht ausgeführt, obwohl technisch gesehen Der Benutzer könnte seinen Benutzernamen fälschen, um anzuzeigen, was immer er anzeigen möchte, er wird nur zurückgesetzt und es ist nicht wie ein Sicherheitsrisiko, da der Benutzername selbst nur für Protokollzwecke gedacht ist und überhaupt nicht mit dem angemeldeten Benutzer zusammenhängt. Dies scheint eine einfache Lösung zu sein, und dann kann Apache Log auf Cookies zugreifen, so dass Sie den einfachsten Zugriff haben. Ich weiß, dass manche Leute die Vorstellung nicht mögen würden, dass ein bestimmter Benutzer seinen eigenen Benutzernamen spoofiert, aber ich denke, das ist die trivialste Lösung, die den Job erledigt. Vor allem in meinem Fall, wenn es eine iPhone-App ist und der Benutzer keinen direkten Zugang zu einer JavaScript-Konsole oder den Cookies selbst hat.

+1

Die Spoofability ist unnötig: Wir setzen jetzt einen Antwortheader (kein Cookie) in der App und lassen ihn vor dem Senden an den Client in nginx fallen, siehe [mein Kommentar zu der Frage] (http://stackoverflow.com/questions/2244244/wsgi-django-pass-username-zurück-zu-apache-for-access-log/10406967 # comment-14514447) –

Verwandte Themen