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.

Back to Top