Uwierzytelnienie przy użyciu 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.
Konfiguracja¶
Najpierw musisz dodać django.contrib.auth.middleware.RemoteUserMiddleware do ustawienia MIDDLEWARE po django.contrib.auth.middleware.AuthenticationMiddleware:
MIDDLEWARE = [
"...",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.auth.middleware.RemoteUserMiddleware",
"...",
]
Następnie musisz zamienić ModelBackend na RemoteUserBackend w ustawieniu 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.
Miej świadomość, że ta konkretna konfiguracja wyłącza autentykację z domyślnym ModelBackend. To oznacza, że jeśli wartość REMOTE_USER nie jest ustawiona, wtedy użytkownik nie jest w stanie się zalogować, nawet używając interfejsu panelu administracyjnego Django. Dodanie 'django.contrib.auth.backends.ModelBackend' do listy AUTHENTICATION_BACKENDS będzie używać ModelBackend jako fallbacku, jeśli nie ma REMOTE_USER, co rozwiąże te problemy.
Zarządzanie użytkownikami Django, tak jak widok w contrib.admin i polecenie createsuperuser nie jest zintegrowane ze zdalnymi użytkownikami. Te interfejsy pracują z użytkownikami przechowywanymi w bazie bez względu na AUTHENTICATION_BACKENDS.
Informacja
Dopóki RemoteUserBackend dziedziczy z ModelBackend ``, będziesz miał te same uprawnienia zaimplementowane w ``ModelBackend.
Użytkownicy z is_active=False nie będą mieli przyzwolenia na uwierzetelnienie. Użyj AllowAllUsersRemoteUserBackend jeśli chcesz na to pozwolić.
If your authentication mechanism uses a custom HTTP header and not
REMOTE_USER, you can subclass RemoteUserMiddleware and set the
header attribute to the desired request.META key. For example:
mysite/middleware.py¶ from django.contrib.auth.middleware import RemoteUserMiddleware
class CustomHeaderRemoteUserMiddleware(RemoteUserMiddleware):
header = "HTTP_AUTHUSER"
This custom middleware is then used in the MIDDLEWARE setting
instead of django.contrib.auth.middleware.RemoteUserMiddleware:
MIDDLEWARE = [
"...",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"mysite.middleware.CustomHeaderRemoteUserMiddleware",
"...",
]
Ostrzeżenie
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.
Jeśli potrzebujesz więcej kontroli, możesz stworzyć swój własny backendowy system uwierzetelniania dziedziczący z RemoteUserBackend i przeładowujący jeden lub więcej jego atrybutów i metod.
Używaj REMOTE_USER tylko na stronach logowania¶
Middleware uwierzytelniający RemoteUserMiddleware zakłada, że nagłówek REMOTE_USER żądania HTTP jest obecny we wszystkich uwierzytelnionych żądaniach. To może być oczekiwane i praktyczne, kiedy użyty jest mechanizm Basic HTTP Auth z htpasswd lub jemu podobne, ale z metodą uwierzytelnienia Negotiate (GSSAPI/Kerberos) lub innymi metodami niewrażliwymi na zasoby, uwierzytelnianie we front-endowym serwerze HTTP jest zazwyczaj tylko przygotowaniem dla jednego lub kilku URLi logowania i po udanym uwierzytelnieniu aplikacja ma za zadanie samodzielnie utrzymać uwierzytelnioną sesję.
PersistentRemoteUserMiddleware dostarcza wsparcia dla tego przypadku użycia. Będzie utrzymywać uwierzetelnioną sesję dopóki użytkownik wprost się nie wyloguje. Klasa może być użytka jako zamiennik RemoteUserMiddleware w powyższej dokumentacji.