Hur man autentiserar med hjälp av REMOTE_USERLink to this heading
Detta dokument beskriver hur man använder externa autentiseringskällor (där webbservern ställer in miljövariabeln REMOTE_USER) i dina Django-applikationer. Den här typen av autentiseringslösning används vanligtvis på intranätplatser, med lösningar för enkel inloggning som IIS och Integrated Windows Authentication eller Apache och mod_authnz_ldap, CAS, WebAuth, mod_auth_sspi, etc.
När webbservern tar hand om autentisering ställer den vanligtvis in miljövariabeln REMOTE_USER för användning i den underliggande applikationen. I Django görs REMOTE_USER tillgänglig i attributet request.META. Django kan konfigureras för att använda värdet REMOTE_USER med hjälp av RemoteUserMiddleware eller PersistentRemoteUserMiddleware och RemoteUserBackend-klasserna som finns i django.contrib.auth.
KonfigurationLink to this heading
Först måste du lägga till django.contrib.auth.middleware.RemoteUserMiddleware i inställningen MIDDLEWARE efter django.contrib.auth.middleware.AuthenticationMiddleware:
MIDDLEWARE = [
"...",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.auth.middleware.RemoteUserMiddleware",
"...",
]
Därefter måste du ersätta ModelBackend med RemoteUserBackend i inställningen AUTHENTICATION_BACKENDS:
AUTHENTICATION_BACKENDS = [
"django.contrib.auth.backends.RemoteUserBackend",
]
Med denna inställning kommer RemoteUserMiddleware att upptäcka användarnamnet i request.META['REMOTE_USER'] och autentisera och automatiskt logga in den användaren med hjälp av RemoteUserBackend.
Var medveten om att just denna inställning inaktiverar autentisering med standard ModelBackend. Detta innebär att om värdet REMOTE_USER inte är inställt kan användaren inte logga in, inte ens med hjälp av Djangos administratörsgränssnitt. Genom att lägga till 'django.contrib.auth.backends.ModelBackend' i listan AUTHENTICATION_BACKENDS kommer ModelBackend att användas som reserv om REMOTE_USER saknas, vilket kommer att lösa dessa problem.
Djangos användarhantering, till exempel vyerna i contrib.admin och kommandot createsuperuser, integreras inte med fjärranvändare. Dessa gränssnitt fungerar med användare som är lagrade i databasen oavsett AUTHENTICATION_BACKENDS.
Om din autentiseringsmekanism använder en anpassad HTTP-header och inte REMOTE_USER, kan du subklassa RemoteUserMiddleware och ställa in attributet header till önskad request.META-nyckel. Till exempel:
mysite/middleware.py from django.contrib.auth.middleware import RemoteUserMiddleware
class CustomHeaderRemoteUserMiddleware(RemoteUserMiddleware):
header = "HTTP_AUTHUSER"
Denna anpassade middleware används sedan i inställningen MIDDLEWARE istället för django.contrib.auth.middleware.RemoteUserMiddleware:
MIDDLEWARE = [
"...",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"mysite.middleware.CustomHeaderRemoteUserMiddleware",
"...",
]
Om du behöver mer kontroll kan du skapa din egen autentiseringsbackend som ärver från RemoteUserBackend och åsidosätta ett eller flera av dess attribut och metoder.
Använda REMOTE_USER endast på inloggningssidorLink to this heading
Autentiseringsmellanvaran RemoteUserMiddleware förutsätter att HTTP-förfrågningshuvudet REMOTE_USER finns med i alla autentiserade förfrågningar. Detta kan vara förväntat och praktiskt när grundläggande HTTP-autentisering med htpasswd eller liknande mekanismer används, men med Negotiate (GSSAPI/Kerberos) eller andra resurskrävande autentiseringsmetoder konfigureras autentiseringen i HTTP-frontservern vanligtvis bara för en eller ett fåtal inloggningsadresser, och efter en lyckad autentisering är det meningen att applikationen själv ska upprätthålla den autentiserade sessionen.
PersistentRemoteUserMiddleware ger stöd för detta användningsfall. Den kommer att behålla den autentiserade sessionen tills användaren uttryckligen loggar ut. Klassen kan användas som en drop-in-ersättning av RemoteUserMiddleware i dokumentationen ovan.