# Django 2.2.9.dev20191202104323 文档

# Apache 利用 Django 的用户数据库进行验证

使用 Apache 时，保持多个身份认证数据同步是一个常见的问题，你可以让 Apache 直接使用 Django 的 验证系统。这要求 Apache 版本 >= 2.2，且 mod_wsgi >= 2.0。例如这样：

- 仅为已授权的用户直接从 Apache 提供 static/media 文件。
- 仅为有特定权限的 Django 用户提供 Subversion 仓库访问。
- 允许某些用户连接到 mod_dav 创建的 WebDAV 共享。

注解

若你已安装了一个 自定义用户模型，且想使用其默认认证处理器，它必须要支持 `is_active` 属性。若你想使用用户组授权，自定义用户必须有个关联名 'groups`，指向一个拥有 'name' 字段的关联对象。若自定义的无法满足上述要求，你也可以指定自定义 mod_wsgi 认证处理器。

## 用 `mod_wsgi` 进行授权认证

注解

以下配置文件中的 `WSGIApplicationGroup %{GLOBAL}` 假定 Apache 实例仅运行了一个 Django 应用。若你运行了不止一个 Django 应用，请参考 mod_wigi 文档的 定义应用集群 章节获取更多配置信息。

确保你已按照 Apache 配合 mod_wsgi 文档正确安装并激活了 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_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 可达性控制机制文档 提供了其它授权机制和方法的更多细节和信息。

### 利用 `mod_wsgi` 和 Django 用户组(groups)进行授权

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" 用户组的成员。