Come autenticarsi usando REMOTE_USERLink to this heading
Questo documento descrive come utilizzare fonti di autenticazione esterne (dove il web server imposta la variabile di ambiente REMOTE_USER) nelle applicazioni Django. Questo tipo di soluzione di autenticazione tipicamente si vede in siti intranet, con soluzioni single sign-on come IIS e Integrated Windows Authentication oppure Apache and mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi, ecc.
Quando il web server si cura dell’autenticazione, tipicamente imposta la variabile d’ambiente REMOTE_USER da usare nell’applicazione. In Django, REMOTE_USER viene resa disponibile nell’attributo request.META. Django può essere configurato per usare il valore di REMOTE_USER usando RemoteUserMiddleware o PersistentRemoteUserMiddleware e le classi RemoteUserBackend che si trovano in django.contrib.auth.
ConfigurazioneLink to this heading
In primo luogo, devi aggiungere la classe django.contrib.auth.middleware.RemoteUserMiddleware nell’impostazione MIDDLEWARE in seguito la classe django.contrib.auth.middleware.AuthenticationMiddleware:
MIDDLEWARE = [
'...',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
'...',
]
Poi, devi sostituire ModelBackend con RemoteUserBackend nella impostazione di AUTHENTICATION_BACKENDS
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.RemoteUserBackend',
]
Con questa configurazione, RemoteUserMiddleware rileverà il nome utente in request.META['REMOTE_USER'] e autenticherà e farà login automaticamente di quell’utente usando la RemoteUserBackend.
Sii cosciente che questa particolare configurazione disabilita l’autenticazione con il ModelBackend di default. Questo significa che se il valore di REMOTE_USER non è impostato, l’utente non potrà fare log in, anche utilizzando l’interfaccia di amministrazione di Django. Aggiungendo 'django.contrib.auth.backends.ModelBackend' all’elenco AUTHENTICATION_BACKENDS si userà ModelBackend come ripiego se è assente REMOTE_USER , risolvendo questo inconveniente.
La gestione utenti di Django, come le view in contrib.admin e il comando di gestione createsuperuser , non si integrano con gli utenti remoti. Queste interfacce lavorano con gli utenti memorizzati nel database, indipendentemente dagli AUTHENTICATION_BACKENDS.
Se il tuo meccanismo di autenticazione usa una intestazione HTTP personalizzata, e non REMOTE_USER, puoi derivare RemoteUserMiddleware e impostare l’attributo header alla chiave request.META desiderata. Per esempio:
from django.contrib.auth.middleware import RemoteUserMiddleware
class CustomHeaderMiddleware(RemoteUserMiddleware):
header = 'HTTP_AUTHUSER'
Se hai necessità di più controllo, puoi creare il tuo backend di autenticazione che eredita da RemoteUserBackend e sostituisce uno o più dei suoi attributi e metodi.
Usare REMOTE_USER solo sulle pagine di loginLink to this heading
Il RemoteUserMiddleware presuppone che l’intestazione HTTP REMOTE_USER sia presente in tutte le richieste che necessitano di autenticazione. Può essere quindi usato quando si ha a che fare con il Basic HTTP Auth con htpasswd o altri semplici meccanismi; quando invece si usa Negotiate (GSSAPI/Kerberos) o un altro metodo di autenticazione che richiede maggiori risorse, l’autenticazione nel server HTTP di front-end è normalmente utilizzata in ambienti ristretti con pochi URL di accesso, e dopo un’autenticazione riuscita, si suppone che l’applicazione mantenga autonomamente la sessione autenticata.
PersistentRemoteUserMiddleware fornisce supporto per questo caso d’uso. Mantiene la sessione autenticata fino ad un logout esplicito dell’utente. La classe può essere usata in sostituzione in cascata di RemoteUserMiddleware nella documentazione di cui sopra.