Hur man autentiserar med hjälp av REMOTE_USER¶
This document describes how to make use of external authentication sources in your Django applications. This type of authentication solution is typically seen on intranet sites, with single sign-on solutions such as IIS and Integrated Windows Authentication or Apache and mod_authnz_ldap, CAS, WebAuth, mod_auth_sspi, etc.
When the web server takes care of authentication it typically provides the
authenticated user as REMOTE_USER. In Django, this value is made available
in request.META (as REMOTE_USER when
supplied as an environment variable, as in WSGI, or HTTP_REMOTE_USER when
supplied via an HTTP header, as in ASGI). Django can be configured to make use
of the REMOTE_USER value using the RemoteUserMiddleware or
PersistentRemoteUserMiddleware, and
RemoteUserBackend classes found in
django.contrib.auth.
Konfiguration¶
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",
]
With this setup, RemoteUserMiddleware will detect the username in
request.META['REMOTE_USER'] (or request.META['HTTP_REMOTE_USER'] under
ASGI) and will authenticate and auto-login that user
using the 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.
Observera
Eftersom RemoteUserBackend ärver från ModelBackend kommer du fortfarande att ha samma behörighetskontroll som implementeras i ModelBackend.
Användare med is_active=False tillåts inte att autentisera sig. Använd AllowAllUsersRemoteUserBackend om du vill tillåta dem att göra det.
Om din autentiseringsmekanism använder en anpassad HTTP-header och inte REMOTE_USER, kan du skapa en underklass till 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",
"...",
]
Varning
RemoteUserMiddleware must not be deployed in configurations where a
client can supply the header. You must be sure that your web server or
reverse proxy always sets or strips that header based on the appropriate
authentication checks, never permitting an end user to submit a fake (or
”spoofed”) header value.
Since the HTTP headers X-Auth-User and X-Auth_User (for example)
both normalize to the HTTP_X_AUTH_USER key in request.META, you
must also check that your web server doesn’t allow a spoofed header using
underscores in place of dashes.
Under WSGI, this warning doesn’t apply to RemoteUserMiddleware in its
default configuration with header = "REMOTE_USER", since a key that
doesn’t start with HTTP_ in request.META can only be set by your
WSGI server, not directly from an HTTP request header.
This warning applies under ASGI in all configurations, because there is no equivalent for a WSGI server’s ability to place a trusted value in the environ. ASGI deployments must use a reverse proxy as described above when using this middleware.
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å inloggningssidor¶
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.