Uwierzytelnienie przy użyciu REMOTE_USER
¶
This document describes how to make use of external authentication sources
(where the web server sets the REMOTE_USER
environment variable) 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.
Kiedy serwer WWW zajmuje się uwierzytelnianiem, zazwyczaj ustawia zmienną środowiskową REMOTE_USER
do użycia w aplikacji bazowej. W Django, REMOTE_USER
jest udostępniony w atrybucie request.META `. Django może być skonfigurowane do wykorzystania wartości ``REMOTE_USER`
za pomocą RemoteUserMiddleware
lub PersistentRemoteUserMiddleware
, oraz RemoteUserBackend`
klas znajdujących się 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ć.
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
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¶
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.