如何使用 REMOTE_USER 進行身份驗證

本文說明如何在 Django 應用程式中使用外部身份驗證來源(網頁伺服器設定 REMOTE_USER 環境變數)。這種身份驗證解決方案通常在內部網路網站上看到,使用單一登入解決方案,例如 IIS 和整合式 Windows 驗證,或 Apache 和 mod_authnz_ldapCASWebAuthmod_auth_sspi 等。

當網頁伺服器處理身份驗證時,它通常會設定 REMOTE_USER 環境變數,以供底層應用程式使用。在 Django 中,REMOTE_USER 可在 request.META 屬性中取得。Django 可以透過使用 RemoteUserMiddlewarePersistentRemoteUserMiddleware,以及在 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-UserX-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 的直接替代品。

返回頂部