# Django 5.2.9 - dokumentacja

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

When the web server takes care of authentication it typically sets the `REMOTE_USER` environment variable for use in the underlying application. In Django, `REMOTE_USER` is made available in the `request.META` attribute. 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",
    ]

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.