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:

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

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

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

Code
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 όπως αναφέρθηκε παραπάνω.