Autentykacja przy użyciu REMOTE_USERLink to this heading

Ten dokument opisuje jak zrobić użytek z zewnętrznych źródeł uwierzytelniania (gdzie Web serwer ustawia zmienną środowiskową REMOTE_USER) w twoich aplikacjach Django. Ten typ sposobu na uwierzytelnianie można zazwyczaj spotkać na stronach intranetowych z rozwiązaniami pojedynczego logowania takimi jak ISS i Integrated Windows Authentication lub Apache i mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi itp.

Kiedy serwer WWW zajmuje się autentykacją, zazwyczaj ustawia zmienną środowiskową REMOTE_USER do użytku w aplikacji pod spodem. W Django REMOTE_USER jest udostępniony w atrybucie request.META. Django może zostać skonfigurowane tak, aby korzystać z wartości REMOTE_USER przy pomocy RemoteUserMiddleware lub PersistentRemoteUserMiddleware i klas RemoteUserBackend, które można znaleźć w django.contrib.auth.

KonfiguracjaLink to this heading

Najpierw musisz dodać django.contrib.auth.middleware.RemoteUserMiddleware do ustawienia MIDDLEWARE po django.contrib.auth.middleware.AuthenticationMiddleware:

Code
MIDDLEWARE = [
    '...',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.RemoteUserMiddleware',
    '...',
]

Następnie musisz zamienić ModelBackend na RemoteUserBackend w ustawieniu AUTHENTICATION_BACKENDS:

Code
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.RemoteUserBackend',
]

W takiej konfiguracji RemoteUserMiddleware wykryje nazwę użytkownika w request.META['REMOTE_USER'] i będzie autentykował ją i automatycznie logował tego użytkownika przy pomocy 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.

Jeśli twój mechanizm uwierzetelniania używa niestandardowego nagłówka HTTP ani REMOTE_USER, możesz stworzyć podklasę RemoteUserMiddleware` i ustawić atrybut header na pożądany klucz request.META. Na przykład:

Code
from django.contrib.auth.middleware import RemoteUserMiddleware

class CustomHeaderMiddleware(RemoteUserMiddleware):
    header = 'HTTP_AUTHUSER'

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 logowaniaLink to this heading

The RemoteUserMiddleware authentication middleware assumes that the HTTP request header REMOTE_USER is present with all authenticated requests. That might be expected and practical when Basic HTTP Auth with htpasswd or other simple mechanisms are used, but with Negotiate (GSSAPI/Kerberos) or other resource intensive authentication methods, the authentication in the front-end HTTP server is usually only set up for one or a few login URLs, and after successful authentication, the application is supposed to maintain the authenticated session itself.

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.