Authentication using REMOTE_USERLink to this heading
Αυτό το άρθρο περιγράφει πως μπορείτε να χρησιμοποιήσετε εξωτερικές πηγές πιστοποίησης (όπου ο Web server έχει ορίσει ως environment variable το REMOTE_USER) μέσα στις Django εφαρμογές σας. Αυτού του είδους η λύση σχετικά με την πιστοποίηση εμφανίζεται, συνήθως, μέσα σε intranet σελίδες, όπου η είσοδος του χρήστη στο σύστημα γίνεται με single sign-on μέσω IIS και του Integrated Windows Authentication ή μέσω Apache και mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi, κλπ.
Όταν ο Web server αναλαμβάνει την πιστοποίηση, στην ουσία θέτει τη μεταβλητή REMOTE_USER ως environment variable για να χρησιμοποιηθεί από την εκάστοτε εφαρμογή. Στο Django, η μεταβλητή REMOTE_USER είναι διαθέσιμη μέσα από το attribute request.META του request object. Το Django μπορεί να παραμετροποιηθεί για να κάνει χρήση της μεταβλητής REMOTE_USER χρησιμοποιώντας τη RemoteUserMiddleware ή τη PersistentRemoteUserMiddleware και την κλάση RemoteUserBackend που βρίσκεται μέσα στο module 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 όπως αναφέρθηκε παραπάνω.