Come autenticarsi usando REMOTE_USER
¶
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 occupa 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 le classi RemoteUserMiddleware
o PersistentRemoteUserMiddleware
e RemoteUserBackend
che si trovano in django.contrib.auth
.
Configurazione¶
In primo luogo, devi aggiungere la classe django.contrib.auth.middleware.RemoteUserMiddleware
nel file settings.py MIDDLEWARE
posizionato dopo 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
.
Nota
Poiché il RemoteUserBackend
eredita da ModelBackend
, avrai ancora tutto il controllo sui permessi che è implementato in ModelBackend
.
Gli utenti con l’attributo is_active=False
non avranno il permesso di autenticarsi. Usa AllowAllUsersRemoteUserBackend
se vuoi permettere l’autenticazione.
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"
Avvertimento
Sii molto attento se utilizzi una sottoclasse di RemoteUserMiddleware
con un’intersatione HTTP personalizzata. Devi essere sicuro che il tuo front-end web server imposti sempre o rimuova quella intestazione in base agli appropriati controlli di autenticazione, impedendo ad un utente di inviare un falso (o «spoofed») valore di intestazione . Poiché le intestazioni HTTP X-Auth-User
e X-Auth_User
(per esempio) sono entrambe normalizzate alla chiave HTTP_X_AUTH_USER
in request.META
, devi anche controllare che il tuo web server non permetta intestazioni false utilizzando trattini bassi al posto dei trattini.
Questo avvertimento non si applica a RemoteUserMiddleware
nella sua configurazione di default con header = 'REMOTE_USER'
, perché una chiave che non inizia con HTTP_
in request.META
può essere impostata solo dal tuo server WSGI, non direttamente da una intestazione di richiesta HTTP.
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 login¶
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.