从 Apache 对 Django 的用户数据库进行身份验证 — Django 文档

来自菜鸟教程
Django/docs/3.2.x/howto/deployment/wsgi/apache-auth
跳转至:导航、​搜索

从 Apache 对 Django 的用户数据库进行身份验证

由于在处理 Apache 时保持多个身份验证数据库同步是一个常见问题,因此您可以将 Apache 配置为直接针对 Django 的 身份验证系统 进行身份验证。 这需要 Apache 版本 >= 2.2 和 mod_wsgi >= 2.0。 例如,您可以:

  • 仅将静态/媒体文件直接从 Apache 提供给经过身份验证的用户。
  • 针对具有特定权限的 Django 用户验证对 Subversion 存储库的访问权限。
  • 允许某些用户连接到使用 mod_dav 创建的 WebDAV 共享。

笔记

如果您已安装 自定义用户模型 并希望使用此默认身份验证处理程序,则它必须支持 is_active 属性。 如果您想使用基于组的授权,您的自定义用户必须有一个名为“组”的关系,指的是具有“名称”字段的相关对象。 如果您的自定义不能符合这些要求,您还可以指定您自己的自定义 mod_wsgi auth 处理程序。


使用 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 与定义由 django-admin startproject 创建的应用程序WSGIScriptAlias 相同。

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