如何使用 REMOTE_USER
進行身份驗證¶
本文說明如何在 Django 應用程式中使用外部身份驗證來源(網頁伺服器設定 REMOTE_USER
環境變數)。這種身份驗證解決方案通常在內部網路網站上看到,使用單一登入解決方案,例如 IIS 和整合式 Windows 驗證,或 Apache 和 mod_authnz_ldap、CAS、WebAuth、mod_auth_sspi 等。
當網頁伺服器處理身份驗證時,它通常會設定 REMOTE_USER
環境變數,以供底層應用程式使用。在 Django 中,REMOTE_USER
可在 request.META
屬性中取得。Django 可以透過使用 RemoteUserMiddleware
或 PersistentRemoteUserMiddleware
,以及在 django.contrib.auth
中找到的 RemoteUserBackend
類別來設定使用 REMOTE_USER
值。
設定¶
首先,您必須將 django.contrib.auth.middleware.RemoteUserMiddleware
新增到 MIDDLEWARE
設定中,**在** django.contrib.auth.middleware.AuthenticationMiddleware
**之後**
MIDDLEWARE = [
"...",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.auth.middleware.RemoteUserMiddleware",
"...",
]
接下來,您必須在 AUTHENTICATION_BACKENDS
設定中,將 ModelBackend
替換為 RemoteUserBackend
AUTHENTICATION_BACKENDS = [
"django.contrib.auth.backends.RemoteUserBackend",
]
透過此設定,RemoteUserMiddleware
將偵測 request.META['REMOTE_USER']
中的使用者名稱,並使用 RemoteUserBackend
驗證並自動登入該使用者。
請注意,此特定設定會停用使用預設 ModelBackend
的身份驗證。這表示,如果未設定 REMOTE_USER
值,則使用者即使使用 Django 的管理介面也無法登入。將 'django.contrib.auth.backends.ModelBackend'
新增到 AUTHENTICATION_BACKENDS
清單中,將在 REMOTE_USER
不存在時使用 ModelBackend
作為後備方案,這將解決這些問題。
Django 的使用者管理,例如 contrib.admin
中的檢視和 createsuperuser
管理命令,不會與遠端使用者整合。這些介面與儲存在資料庫中的使用者一起運作,無論 AUTHENTICATION_BACKENDS
為何。
注意
由於 RemoteUserBackend
繼承自 ModelBackend
,您仍然擁有在 ModelBackend
中實作的所有相同權限檢查。
具有 is_active=False
的使用者將不允許進行身份驗證。如果您希望允許他們進行身份驗證,請使用 AllowAllUsersRemoteUserBackend
。
如果您的身份驗證機制使用自訂 HTTP 標頭,而不是 REMOTE_USER
,您可以子類別化 RemoteUserMiddleware
並將 header
屬性設定為所需的 request.META
金鑰。例如
from django.contrib.auth.middleware import RemoteUserMiddleware
class CustomHeaderMiddleware(RemoteUserMiddleware):
header = "HTTP_AUTHUSER"
警告
如果使用具有自訂 HTTP 標頭的 RemoteUserMiddleware
子類別,請務必非常小心。您必須確保您的前端網頁伺服器始終根據適當的身份驗證檢查來設定或剝離該標頭,永遠不允許終端使用者提交偽造(或「欺騙」)的標頭值。由於 HTTP 標頭 X-Auth-User
和 X-Auth_User
(例如)都會在 request.META
中標準化為 HTTP_X_AUTH_USER
金鑰,您還必須檢查您的網頁伺服器是否不允許使用底線代替破折號的欺騙標頭。
此警告不適用於預設設定為 header = 'REMOTE_USER'
的 RemoteUserMiddleware
,因為 request.META
中不以 HTTP_
開頭的金鑰只能由您的 WSGI 伺服器設定,而不能直接從 HTTP 請求標頭設定。
如果您需要更多控制權,您可以建立自己的身份驗證後端,該後端繼承自 RemoteUserBackend
並覆寫其一個或多個屬性和方法。
僅在登入頁面上使用 REMOTE_USER
¶
RemoteUserMiddleware
身份驗證中介軟體假設 HTTP 請求標頭 REMOTE_USER
出現在所有已驗證的請求中。當使用具有 htpasswd
或類似機制的 Basic HTTP 驗證時,這可能是預期的且實用的,但是對於 Negotiate (GSSAPI/Kerberos) 或其他資源密集型身份驗證方法,前端 HTTP 伺服器中的身份驗證通常僅針對一個或幾個登入 URL 進行設定,並且在成功驗證後,應用程式應自行維護已驗證的工作階段。
PersistentRemoteUserMiddleware
為此使用案例提供支援。它將維護已驗證的工作階段,直到使用者明確登出。此類別可以用作上述文件中 RemoteUserMiddleware
的直接替代品。