2010-02-11 5 views
8

La mia app Django, implementata in mod_wsgi sotto Apache utilizzando lo standard WSGIHandler di Django, autentica gli utenti tramite il login del modulo sul lato Django. Quindi, per Apache, l'utente è anonimo. Ciò rende il log di accesso di Apache meno utile.WSGI/Django: passa il nome utente ad Apache per il registro degli accessi

C'è un modo per passare il nome utente attraverso il wrapper WSGI ad Apache dopo aver gestito la richiesta, in modo che compaia nel log di accesso di Apache?

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

+0

Questo non è banalmente possibile, per quanto ne so, sarò molto interessato se verrà pubblicata una risposta valida. Ho usato l'autenticazione Apache per i miei scopi. – MattH

+0

Questo risultò essere banalmente possibile in nginx: app imposta un'intestazione di risposta; nginx include quello nel log di accesso tramite ['log_format'] (http://wiki.nginx.org/HttpLogModule#log_format), e lo elimina prima di inviarlo al client tramite [' uwsgi_hide_header'] (http: //wiki.nginx .org/HttpUwsgiModule # uwsgi_hide_header) –

+0

Esiste anche una soluzione per Apache? – mynameistechno

risposta

4

È possibile farlo solo se si utilizza la modalità incorporata e solo se si utilizza un pacchetto separato denominato apswigpy, che fornisce un collegamento Python per l'oggetto di richiesta originale Apache. Il pacchetto mod_wsgi fornisce un meccanismo opzionale per consentire il passaggio dell'oggetto di richiesta Apache originale come riferimento a COthon di Python nell'ambiente WSGI. Si utilizza che in combinazione con qualcosa di simile apswigpy:

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

almeno credo che il programma di installazione le informazioni appropriate cui l'accesso di registrazione può quindi utilizzare.

Si dovrebbe davvero portare questa discussione alla mailing list mod_wsgi.

+0

Grazie; Ho iniziato un thread lì e accetto questa risposta come il più vicino che potremmo ottenere qui. :) –

+0

La discussione è arrivata con qualcosa di meglio? –

1

questo probabilmente non è quello che ci si aspetta, ma è possibile utilizzare il nome utente nel vostro schema URL. In questo modo l'utente si troverà nella sezione path dei tuoi log di apache.

È necessario modificare l'autenticazione in modo che le risposte richieste dall'autenticazione siano evidenti nei log di apache, altrimenti durante la visualizzazione dei registri è possibile attribuire richieste non autenticate agli utenti autenticati. Per esempio. restituire un reindirizzamento temporaneo alla pagina di accesso se la richiesta non è autenticata.

+0

Login view reindirizzamento a/loggedin/ reindirizzamento a settings.LOGIN_REDIRECT_URL. È hacky, ma mi piace. – muhuk

+0

Hai ragione - non è quello che mi aspetto. :) Il nome utente nell'URL non è accettabile per me. –

3

È possibile utilizzare mod_auth_tkt. Un auth_tkt è un cookie firmato con l'id utente che Apache può comprendere. La tua applicazione web dovrebbe essere set the cookie quando l'utente esegue il login e l'uscita. Apache può derivare un REMOTE_USER dal cookie, passarlo alla tua app Web o un'applicazione Web non-Django in esecuzione sullo stesso server, includerla nei log, in qualsiasi modo.

+0

Sembra solo il biglietto * cough *. Una difficoltà minore potrebbe essere il legame con l'IP, potrebbe causare problemi a chiunque dietro proxy carichi bilanciati. Inoltre potrebbe rendere difficile invertire il proxy dell'applicazione. – MattH

+0

No, non causa problemi. Il cookie è facoltativamente associato all'indirizzo IP dell'utente remoto. Puoi passarlo con un X-header o altri mezzi a seconda della natura del tuo proxy. – joeforker

+0

Questa sembra una soluzione abbastanza accurata, in realtà; abilita il single-signon con altre app. Inoltre renderebbe possibile accedere (e controllare) l'accesso a supporti statici non gestiti da mod_wsgi; non è una grande cosa per noi, ma un bel vantaggio aggiunto. Grazie! –

1

Correggetemi se ho torto, ma cosa vi impedisce di creare un middleware personalizzato che imposta un cookie uguale al nome visualizzato dell'utente corrente. Questo middleware verrà eseguito su ogni vista, quindi anche se tecnicamente il l'utente potrebbe spoofingare il suo nome utente per visualizzare ciò che vuole che venga visualizzato, sarà comunque resettato e non è come un rischio per la sicurezza perché il nome utente è solo per scopi di log, per niente relativo all'utente che ha effettuato l'accesso. Questa sembra una soluzione abbastanza semplice, e quindi il log di Apache può accedere ai cookie in modo da fornire un accesso più semplice. So che ad alcune persone non piacerebbe l'idea di un dato utente che spoofing il proprio nome utente, ma penso che questa sia la soluzione più banale che ottiene il lavoro. Soprattutto, nel mio caso, quando si tratta di un'app per iPhone e l'utente non ha accesso diretto a una console javascript o ai cookie stessi.

+1

Lo spoofability non è necessario: ora impostiamo un'intestazione di risposta (non un cookie) nell'app e lo rilasciamo in nginx prima di inviarlo al client, vedere [il mio commento sulla domanda] (http://stackoverflow.com/questions/2244244/WSGI-django-pass-nome utente-back-to-apache-per-access-log/10406967 # comment-14514447) –

Problemi correlati