How to authenticate using REMOTE_USERLink to this heading
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, Cosign,
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.
ΠαραμετροποίησηLink to this heading
Πρώτα πρέπει να προσθέσετε τη 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.
Οι χρήστες με το attribute is_active=False δεν θα τους επιτραπεί να πιστοποιηθούν. Για να το παρακάμψετε αυτό χρησιμοποιήστε την κλάση AllowAllUsersRemoteUserBackend.
from django.contrib.auth.middleware import RemoteUserMiddleware
class CustomHeaderMiddleware(RemoteUserMiddleware):
header = "HTTP_AUTHUSER"
Αν χρειάζεστε περισσότερο έλεγχο, μπορείτε να δημιουργήσετε το δικό σας backend πιστοποίησης ο οποίος θα κληρονομεί από την κλάση RemoteUserBackend και θα παρακάμπτει (override) ένα ή περισσότερα από τα attributes και τις μεθόδους της.
Χρήση του REMOTE_USER μόνο στις σελίδες loginLink to this heading
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 όπως αναφέρθηκε παραπάνω.