Domanda

Abbiamo un sito Web in esecuzione su Apache, il cui accesso ha un certo numero di pagine statiche protette tramite autenticazione HTTP di base.

Ho scritto una nuova parte del sito con Django usando il supporto integrato di Django per la gestione degli utenti.

Il problema che ho è che gli utenti devono accedere una volta tramite l'autenticazione HTTP Basic e poi di nuovo usando un modulo di login Django. Questo è allo stesso tempo goffo e molto confuso per gli utenti.

Mi chiedevo se qualcuno avesse trovato un modo per fare in modo che Django accedesse a un utente usando le informazioni di autenticazione HTTP di base.

Non mi aspetto di passare una password a Django, ma piuttosto se un utente dave è stato autenticato da Apache, dovrebbero essere automaticamente registrati anche in Django come dave .

(Un'opzione sarebbe quella di far condividere Apache e Django in un archivio utenti per garantire nomi utente e password comuni, ma ciò implicherebbe comunque due richieste di accesso che è ciò che sto cercando di evitare.)

È stato utile?

Soluzione

Questo è stato aggiunto alla versione 1.3 di Django. Vedi più documentazione corrente per questo qui: http://docs.djangoproject.com/en/dev/howto/ auth-remote-user /

Altri suggerimenti

Per supportare solo l'autenticazione di base su alcune richieste (e non confondere con il web server - ecco come qualcuno potrebbe interpretare il titolo della tua domanda), ti consigliamo di guardare qui:

http://www.djangosnippets.org/snippets/243/

Dai un'occhiata ai link di Oli. Fondamentalmente vedi il nome utente autenticato verificato dall'autenticazione HTTP di base in Django guardando request.META ['REMOTE_USER'].

Aggiornamento: testato la patch proposta per il ticket # 689 , che è disponibile nel repository git di telenieko qui . Si applica in modo pulito almeno sulla revisione 9084 di Django.

Attiva il back-end di autenticazione dell'utente remoto entro

  • aggiunta del RemoteUserAuthMiddleware dopo AuthenticationMiddleware
  • aggiunta dell'impostazione AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

Se usi lighttpd e FastCGI come faccio io, attiva mod_auth, crea le credenziali per un utente di test (l'ho chiamato testuser e impostato 123 come password) e configura il sito Django richiede l'autenticazione di base.

Il seguente urls.py può essere utilizzato per testare l'installazione:

from django.conf.urls.defaults import *
from django.http import HttpResponse
from django.contrib.auth.models import User
urlpatterns = patterns('',
    url(regex='^

Dopo aver ricaricato lighty e il server Django FCGI, il caricamento della radice del sito ora richiede l'autenticazione e accetta le credenziali testuser , quindi genera un dump dell'oggetto richiesta. In request.META dovrebbero essere presenti queste nuove proprietà:

'AUTH_TYPE': 'Basic'
'HTTP_AUTHORIZATION': 'Basic dGVzdHVzZXI6MTIz'
'REMOTE_USER': 'testuser'

L'URL / user / può essere utilizzato per verificare che tu abbia effettivamente effettuato l'accesso come testuser :

<User: testuser>

E l'URL / users / ora elenca automaticamente testuser (qui l'utente admin che avevo creato facendo syncdb è anche mostrato):

admin,testuser

Se non vuoi patchare Django, è banale staccare le classi RemoteUserAuthBackend e RemoteUserAuthMiddleware in un modulo separato e fare riferimento a quello nelle impostazioni di Django.

, view=lambda request: HttpResponse(repr(request), 'text/plain')), url(regex='^user/

Dopo aver ricaricato lighty e il server Django FCGI, il caricamento della radice del sito ora richiede l'autenticazione e accetta le credenziali testuser , quindi genera un dump dell'oggetto richiesta. In request.META dovrebbero essere presenti queste nuove proprietà:

<*>

L'URL / user / può essere utilizzato per verificare che tu abbia effettivamente effettuato l'accesso come testuser :

<*>

E l'URL / users / ora elenca automaticamente testuser (qui l'utente admin che avevo creato facendo syncdb è anche mostrato):

<*>

Se non vuoi patchare Django, è banale staccare le classi RemoteUserAuthBackend e RemoteUserAuthMiddleware in un modulo separato e fare riferimento a quello nelle impostazioni di Django.

, view=lambda request: HttpResponse(repr(request.user), 'text/plain')), url(regex='^users/

Dopo aver ricaricato lighty e il server Django FCGI, il caricamento della radice del sito ora richiede l'autenticazione e accetta le credenziali testuser , quindi genera un dump dell'oggetto richiesta. In request.META dovrebbero essere presenti queste nuove proprietà:

<*>

L'URL / user / può essere utilizzato per verificare che tu abbia effettivamente effettuato l'accesso come testuser :

<*>

E l'URL / users / ora elenca automaticamente testuser (qui l'utente admin che avevo creato facendo syncdb è anche mostrato):

<*>

Se non vuoi patchare Django, è banale staccare le classi RemoteUserAuthBackend e RemoteUserAuthMiddleware in un modulo separato e fare riferimento a quello nelle impostazioni di Django.

, view=lambda request: HttpResponse( ','.join(u.username for u in User.objects.all()), 'text/plain')), )

Dopo aver ricaricato lighty e il server Django FCGI, il caricamento della radice del sito ora richiede l'autenticazione e accetta le credenziali testuser , quindi genera un dump dell'oggetto richiesta. In request.META dovrebbero essere presenti queste nuove proprietà:

<*>

L'URL / user / può essere utilizzato per verificare che tu abbia effettivamente effettuato l'accesso come testuser :

<*>

E l'URL / users / ora elenca automaticamente testuser (qui l'utente admin che avevo creato facendo syncdb è anche mostrato):

<*>

Se non vuoi patchare Django, è banale staccare le classi RemoteUserAuthBackend e RemoteUserAuthMiddleware in un modulo separato e fare riferimento a quello nelle impostazioni di Django.

C'è httpauth.py . Sono ancora una novità assoluta con Django, quindi non ho idea di come si adatti esattamente, ma dovrebbe fare quello che stai cercando.

Modifica: ecco un thread di bug più lungo sull'argomento .

Poiché django può essere eseguito in diversi modi e solo modpython ti offre una stretta integrazione con Apache, non credo che ci sia un modo per django di accedere in base all'autorizzazione di base di Apache. L'autenticazione dovrebbe davvero essere eseguita a livello di applicazione in quanto ti darà molto più controllo e sarà più semplice. Non vuoi davvero la seccatura di condividere un userdata tra Python e Apache.

Se non ti dispiace usare una versione con patch di Django, allora c'è una patch in http: //www.djangosnippets.org/snippets/56/ che ti fornirà un middleware per supportare l'autent di base.

L'autorizzazione di base è davvero molto semplice: se l'utente non ha effettuato l'accesso, viene restituito un codice di stato richiesto per l'autenticazione 401. Ciò richiede al browser di visualizzare una casella di accesso. Il browser fornirà quindi il nome utente e la password come stringhe con codifica bas64. La voce di Wikipedia http://en.wikipedia.org/wiki/Basic_access_authentication è abbastanza buona.

Se la patch non fa quello che vuoi, puoi implementare l'autent di base abbastanza rapidamente.

Questo sembra essere un compito per AuthenticationBackend personalizzato - vedi Documentazione Django su questo argomento , djangosnippets.org ha alcuni esempi reali di tale codice (vedi 1 o 2 ) (e questa non è davvero una cosa difficile).

Le sottoclassi

?? AuthenticationBackend devono avere solo 2 metodi definiti e il loro codice è piuttosto semplice: uno deve restituire l'oggetto Utente per l'ID utente, il secondo deve eseguire il controllo delle credenziali e restituire l'oggetto Utente se le credenziali sono validi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top