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