Bagaimana mengotentikasi menggunakan REMOTE_USER¶
This document describes how to make use of external authentication sources 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 provides the
authenticated user as REMOTE_USER. In Django, this value is made available
in request.META (as REMOTE_USER when
supplied as an environment variable, as in WSGI, or HTTP_REMOTE_USER when
supplied via an HTTP header, as in ASGI). 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.
Pengaturan¶
Pertama, andaharus menambahkan django.contrib.auth.middleware.RemoteUserMiddleware pada pengaturan MIDDLEWARE setelah django.contrib.auth.middleware.AuthenticationMiddleware:
MIDDLEWARE = [
"...",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.auth.middleware.RemoteUserMiddleware",
"...",
]
Selanjutnya, anda harus mengganti ModelBackend dengan RemoteUserBackend di pengaturan AUTHENTICATION_BACKENDS
AUTHENTICATION_BACKENDS = [
"django.contrib.auth.backends.RemoteUserBackend",
]
With this setup, RemoteUserMiddleware will detect the username in
request.META['REMOTE_USER'] (or request.META['HTTP_REMOTE_USER'] under
ASGI) and will authenticate and auto-login that user
using the RemoteUserBackend.
Waspada bahwa setelan khusus ini meniadakan pembuktian keaslian dengan awal ModelBackend. Ini berarti bahwa jika nilai REMOTE_USER tidak disetel kemudian pengguna tidak dapat masuk, bahkan menggunakan antarmuka admin Django. Menambahkan 'django.contrib.auth.backends.ModelBackend' pada daftar AUTHENTICATION_BACKENDS akan menggunakan ModelBackend sebagai alternatif jika REMOTE_USER tidak hadir, yang akan menyelesaikan masalah ini.
Pengelola pengguna Django, seperti tampilan dalam perintah pengelola contrib.admin dan the createsuperuser, tidak dipadukan dengan pengguna kendali jauh. Antarmuka ini bekerja dengan pengguna disimpan dalam basisdata tanpa memperhatikan AUTHENTICATION_BACKENDS.
Catatan
Sejak RemoteUserBackend warisan dari ModelBackend, anda akan masih mempunyai semua pemeriksaan perizinan sama yang diterapkan dalam ModelBackend.
Pengguna dengan is_active=False tidak akan diizinkan mengotentifikasi. Gunakan AllowAllUsersRemoteUserBackend jika anda ingin mengizinkan mereka.
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"
Middleware penyesuaian digunakan dalam pengaturan MIDDLEWARE daripada django.contrib.auth.middleware.RemoteUserMiddleware:
MIDDLEWARE = [
"...",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"mysite.middleware.CustomHeaderRemoteUserMiddleware",
"...",
]
Peringatan
RemoteUserMiddleware must not be deployed in configurations where a
client can supply the header. You must be sure that your web server or
reverse proxy always sets or strips that header based on the appropriate
authentication checks, never permitting an end user to submit a fake (or
"spoofed") header value.
Since the HTTP headers X-Auth-User and X-Auth_User (for example)
both normalize to the HTTP_X_AUTH_USER key in request.META, you
must also check that your web server doesn't allow a spoofed header using
underscores in place of dashes.
Under WSGI, this warning doesn't apply to RemoteUserMiddleware in its
default configuration with header = "REMOTE_USER", since a key that
doesn't start with HTTP_ in request.META can only be set by your
WSGI server, not directly from an HTTP request header.
This warning applies under ASGI in all configurations, because there is no equivalent for a WSGI server's ability to place a trusted value in the environ. ASGI deployments must use a reverse proxy as described above when using this middleware.
Jika anda butuh lebih kendali, anda dapat membuat backend pembuktian keaslian sendiri yang mewarisi dari RemoteUserBackend dan menimpa satu atau lebih atribut dan metodenya.
Menggunakan REMOTE_USER hanya pada halaman masuk¶
Middleware autentifikasi RemoteUserMiddleware beranggapan bahwa kepala peminta HTTP REMOTE_USE hadir dengan semua permintaan terautentifikasi. Itu mungkin diharapkan dan praktis ketika Basic HTTP Auth dengan htpasswd atau mekanisme yang mirip digunakan, tetapi dengan Negotiate (GSSAPI/Kerberos) atau metode otentikasi sumber daya intensif lainnya, autentifikasi dalam peladen HTTP font-end biasanya hanya menyetel untuk satu atau sedikit URL masuk, dan setelah autentifikasi berhasil, aplikasi diharapkan merawat sesu autentifikasi itu sendiri.
PersistentRemoteUserMiddleware menyediakan dukungan untuk penggunaan kasus ini. Dia akan menjaga sesi dibuktikan keasliannya sampai keluar oleh pengguna. Kelas dapat digunakan sebagai pengganti dari RemoteUserMiddleware dalam dokumentasi diatas.