如何從 Apache 驗證 Django 的使用者資料庫

由於在處理 Apache 時,保持多個驗證資料庫同步是一個常見的問題,您可以設定 Apache 直接根據 Django 的驗證系統進行驗證。這需要 Apache 版本 >= 2.2 和 mod_wsgi >= 2.0。例如,您可以

  • 僅向已驗證的使用者直接從 Apache 提供靜態/媒體檔案。

  • 使用具有特定權限的 Django 使用者驗證對Subversion儲存庫的存取。

  • 允許某些使用者連線到使用mod_dav建立的 WebDAV 共用。

注意

如果您已安裝自訂使用者模型,並想使用此預設驗證處理程式,則它必須支援 is_active 屬性。如果您想要使用基於群組的授權,您的自訂使用者必須有一個名為「groups」的關係,指向具有「name」欄位的相關物件。如果您的自訂使用者無法符合這些要求,您也可以指定自己的自訂 mod_wsgi 驗證處理程式。

使用 mod_wsgi 驗證

注意

以下組態中使用 WSGIApplicationGroup %{GLOBAL} 假設您的 Apache 實例只執行一個 Django 應用程式。如果您正在執行多個 Django 應用程式,請參閱 mod_wsgi 文件中的定義應用程式群組章節,以取得有關此設定的更多資訊。

請確保 mod_wsgi 已安裝並啟用,並且您已按照步驟設定Apache with mod_wsgi

接下來,編輯您的 Apache 組態,以新增您希望僅限已驗證使用者才能檢視的位置

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    Require valid-user
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>

WSGIAuthUserScript 指令會告知 mod_wsgi 執行指定 wsgi 腳本中的 check_password 函式,並傳遞從提示收到的使用者名稱和密碼。在此範例中,WSGIAuthUserScript 與定義應用程式的 WSGIScriptAlias 相同,該應用程式是由 django-admin startproject 建立

使用 Apache 2.2 進行驗證

請確保已載入 mod_auth_basicmod_authz_user

這些可能會靜態編譯到 Apache 中,或者您可能需要在 httpd.conf 中使用 LoadModule 動態載入它們

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so

最後,編輯您的 WSGI 腳本 mysite.wsgi,透過匯入 check_password 函式,將 Apache 的驗證連結到您網站的驗證機制

import os

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"

from django.contrib.auth.handlers.modwsgi import check_password

from django.core.handlers.wsgi import WSGIHandler

application = WSGIHandler()

現在,以 /secret/ 開頭的要求將需要使用者進行驗證。

mod_wsgi 存取控制機制文件提供了有關其他驗證方法的更多詳細資訊和資訊。

使用 mod_wsgi 和 Django 群組授權

mod_wsgi 還提供將特定位置限制為群組成員的功能。

在這種情況下,Apache 組態應該如下所示

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
    WSGIAuthGroupScript /path/to/mysite.com/mysite/wsgi.py
    Require group secret-agents
    Require valid-user
</Location>

為了支援 WSGIAuthGroupScript 指令,相同的 WSGI 腳本 mysite.wsgi 也必須匯入 groups_for_user 函式,該函式會傳回給定使用者所屬的群組列表。

from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user

現在,對 /secret/ 的請求還需要使用者成為「secret-agents」群組的成員。

返回頂部