# Τεκμηρίωση του Django - 5.2.8

# How to authenticate using `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`.

## Παραμετροποίηση

Πρώτα πρέπει να προσθέσετε τη middleware κλάση `django.contrib.auth.middleware.RemoteUserMiddleware` στη ρύθμιση `MIDDLEWARE` μετά τη middleware κλάση `django.contrib.auth.middleware.AuthenticationMiddleware`:

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

Κατόπιν, πρέπει να αντικαταστήσετε την κλάση `ModelBackend` με την `RemoteUserBackend` μέσα στη ρύθμιση `AUTHENTICATION_BACKENDS`:

    AUTHENTICATION_BACKENDS = [
        "django.contrib.auth.backends.RemoteUserBackend",
    ]

Με αυτές τις ρυθμίσεις, η `RemoteUserMiddleware` θα ανιχνεύσει το username μέσα στο `request.META['REMOTE_USER']` και όχι μόνο θα πιστοποιήσει αλλά και θα εισάγει αυτόν τον χρήστη αυτόματα στο σύστημα, χρησιμοποιώντας την κλάση `RemoteUserBackend`.

Ιδιαίτερη προσοχή πρέπει να δοθεί στο γεγονός ότι η ανωτέρω συγκεκριμένη ρύθμιση απενεργοποιεί την πιστοποίηση του, προεπιλεγμένου, `ModelBackend`. Αυτό σημαίνει ότι αν η τιμή της μεταβλητής `REMOTE_USER` δεν έχει οριστεί, τότε ο χρήστης δεν θα μπορεί να κάνει log in στο σύστημα, ακόμη και αν χρησιμοποιεί το interface του Django admin. Για την επίλυση αυτού, απλώς προσθέστε το `'django.contrib.auth.backends.ModelBackend'` στη λίστα `AUTHENTICATION_BACKENDS`. Με αυτό τον τρόπο το Django θα χρησιμοποιήσει το `ModelBackend` ως fallback αν το `REMOTE_USER` δεν έχει οριστεί.

Η διαχείριση των χρηστών του Django, όπως τα views μέσα στο `contrib.admin` και η εντολή `createsuperuser`, δεν δουλεύουν με τους απομακρυσμένους χρήστες (remote users). Αυτά τα interfaces δουλεύουν με τους χρήστες οι οποίοι είναι αποθηκευμένοι στην βάση δεδομένων ανεξαρτήτως της ρύθμισης `AUTHENTICATION_BACKENDS`.

Σημείωση

Επειδή η κλάση `RemoteUserBackend` κληρονομεί από την `ModelBackend`, θα έχετε στην διάθεση σας όλο το API, που είναι υλοποιημένο στο `ModelBackend` και αφορά τον έλεγχο δικαιωμάτων των χρηστών.

Οι χρήστες με το attribute `is_active=False` δεν θα τους επιτραπεί να πιστοποιηθούν. Για να το παρακάμψετε αυτό χρησιμοποιήστε την κλάση `AllowAllUsersRemoteUserBackend`.

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",
        "...",
    ]

Προειδοποίηση

Να είστε εξαιρετικά προσεκτικοί όταν χρησιμοποιείτε κάποια subclass της `RemoteUserMiddleware` η οποία ορίζει δικό της HTTP header. Πρέπει να είστε σίγουροι ότι ο front-end web server ορίζει ή αφαιρεί πάντα αυτόν τον header βασιζόμενος στους κατάλληλους ελέγχους πιστοποίησης. Ποτέ να μην επιτρέπετε στον τελικό χρήστη να μπορεί να καταθέτει ψεύτικες (ή «πλαστογραφημένες») τιμές του header. Εφόσον οι HTTP headers, π.χ `X-Auth-User` και `X-Auth_User` ομαλοποιούνται και οι δύο στο κλειδί `HTTP_X_AUTH_USER` του `request.META`, θα πρέπει, επίσης, να ελέγξετε ότι ο web server σας δεν επιτρέπει πλαστογραφημένους headers οι οποίοι χρησιμοποιούν κάτω παύλες (“_”) αντί σκέτων παυλών (“-”).

Η παραπάνω προειδοποίηση δεν αφορά μόνο την κλάση `RemoteUserMiddleware` με τις προεπιλεγμένες της ρυθμίσεις (`header = 'REMOTE_USER'`), αφού ένα κλειδί που το όνομα του δεν ξεκινά με το `HTTP_` μέσα στο `request.META`, μπορεί να οριστεί μόνο από τον WSGI server σας και όχι απ’ ευθείας από ένα HTTP request header.

Αν χρειάζεστε περισσότερο έλεγχο, μπορείτε να δημιουργήσετε το δικό σας backend πιστοποίησης ο οποίος θα κληρονομεί από την κλάση `RemoteUserBackend` και θα παρακάμπτει (override) ένα ή περισσότερα από τα attributes και τις μεθόδους της.

## Χρήση του `REMOTE_USER` μόνο στις σελίδες login

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

Η middleware κλάση `PersistentRemoteUserMiddleware` παρέχει υποστήριξη για αυτήν ακριβώς την περίπτωση. Θα διατηρήσει το πιστοποιημένο session μέχρις ότου ο χρήστης κάνει logout ο ίδιος. Η κλάση μπορεί να χρησιμοποιηθεί ως αντικατάσταση της `RemoteUserMiddleware` όπως αναφέρθηκε παραπάνω.