如何通过 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_basicmod_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 的访问控制机制文档提供了其他详细信息和有关替代身份验证方法的信息。

使用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”组的成员。

返回顶部