Autentykacja przy użyciu REMOTE_USER
¶
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
.
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',
]
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
.
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ć.
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:
from django.contrib.auth.middleware import RemoteUserMiddleware
class CustomHeaderMiddleware(RemoteUserMiddleware):
header = 'HTTP_AUTHUSER'
Ostrzeżenie
Bądź bardzo ostrożny kiedy używać podklasy RemoteUserMiddleware
z niestandardowym nagłówkiem HTTP. Musisz być pewny, że twój serwer front-endowy zawsze ustawi lub usunie ten nagłówek w oparciu o odpowiednie sprawdzenia autentykacji, nigdy nie pozwalając użytkownikowi końcowemu na przesłanie fałszywej (lub „sfałszowanej”) wartości nagłówka.
To ostrzeżenie nie dotyczy RemoteUserMiddleware
z domyślną konfiguracją header = 'REMOTE_USER'
, ponieważ klucz nie zaczynający się od HTTP_
w request.META
może być ustawiony tylko przez twój serwer WSGI, nie bezpośrednio z nagłówka żądania HTTP.
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¶
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.