Authenticating against Django’s user database from Apache

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

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

如果您安装了custom user model,并希望使用该默认的auth处理程序,则它必须支持is_active属性。 如果要使用基于组的授权,您的自定义用户必须具有名为“groups”的关系,引用具有“name”字段的相关对象。 如果您的自定义不能符合这些要求,您还可以指定自己的自定义mod_wsgi auth处理程序。

mod_wsgi 进行认证

在以下配置中使用WSGIApplicationGroup %{GLOBAL}假定您的Apache实例仅运行一个Django应用程序。 如果您正在运行多个Django应用程序,请参阅mod_wsgi文档的定义应用程序组部分,以获取有关此设置的更多信息。

确保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>

check_password指令告诉mod_wsgi在指定的wsgi脚本中执行WSGIAuthUserScript函数,传递从提示接收的用户名和密码。 In this example, the WSGIAuthUserScript is the same as the WSGIScriptAlias that defines your application that is created by django-admin startproject.

使用Apache 2.2与身份验证

请确保加载了mod_authz_usermod_auth_basic

这些可能会静态编译到Apache中,或者您可能需要使用LoadModule在httpd.conf中动态加载它们:

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

最后,编辑您的WSGI脚本check_password,通过导入mysite.wsgi函数将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>

要支持mysite.wsgi指令,同一个WSGI脚本groups_for_user还必须导入WSGIAuthGroupScript函数,返回给定用户所属的。

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

/secret/的请求现在也将要求用户成为“secret-agents”组的成员。