如何从阿帕奇向Django的用户数据库进行身份验证

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

  • 仅向经过身份验证的用户直接从Apache提供静态/媒体文件。

  • 对访问进行身份验证 Subversion 拥有一定权限的django用户的存储库。

  • 允许某些用户连接到使用创建的WebDAV共享 mod_dav.

备注

如果安装了 custom user model 如果要使用此默认身份验证处理程序,它必须支持 is_active 属性。如果要使用基于组的授权,则自定义用户必须具有名为“groups”的关系,该关系指的是具有“name”字段的相关对象。如果自定义不符合这些要求,也可以指定自己的自定义mod wsgi auth处理程序。

身份验证 mod_wsgi

备注

WSGIApplicationGroup %{{GLOBAL}} 在下面的配置中,假设您的Apache实例只运行一个Django应用程序。如果您运行的是多个Django应用程序,请参阅 Defining Application Groups 有关此设置的详细信息,请参阅mod wsgi docs的部分。

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

这个 WSGIAuthUserScript 指令告诉mod wsgi执行 check_password 函数,传递从提示收到的用户名和密码。在这个例子中, WSGIAuthUserScriptWSGIScriptAlias 定义应用程序的 that is created by django-admin startproject .

使用带有身份验证的Apache2.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 功能:

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/ 现在需要用户进行身份验证。

MODYWSGI access control mechanisms documentation 提供有关其他身份验证方法的详细信息和信息。

授权 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/ 现在还需要用户成为“秘密代理”组的成员。