如何通过 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,并且您已按照步骤设置了使用 mod_wsgi 的 Apache。
接下来,编辑您的 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_basic
和mod_authz_user
。
这些可能已静态编译到 Apache 中,或者您可能需要使用 LoadModule 在您的httpd.conf
中动态加载它们。
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 的访问控制机制文档提供了其他详细信息和有关替代身份验证方法的信息。