# Django 4.2.9.dev20231204082947 - dokumentacja

# Uwierzytelnienie 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 IIS i Integrated Windows Authentication lub Apache i mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi itp.

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ć.

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

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.