我们有一个在 Apache 上运行的网站,访问该网站有许多通过 HTTP 基本身份验证保护的静态页面。
我使用 Django 内置的用户管理支持,用 Django 编写了网站的新部分。
我遇到的问题是用户必须通过 HTTP Basic 身份验证登录一次,然后再使用 Django 登录表单。这对用户来说既笨拙又令人困惑。
我想知道是否有人找到了让 Django 使用 HTTP Basic 身份验证信息登录用户的方法。
我不希望将密码传递给 Django,而是如果用户dave
已经被 Apache 验证,那么它们也应该自动登录到 Django dave
。
(一种选择是让 Apache 和 Django 共享一个用户存储来确保常见的用户名和密码,但这仍然会涉及两个登录提示,这就是我想要的 avoid.)
6 回答
这已被添加到 Django 1.3 版本中。在此处查看更多当前文档:http://docs.djangoproject.com/en/dev/howto/auth-remote-user/
对于仅支持某些请求的基本身份验证(而不是与 Web 服务器混淆 - 这是某人可能解释您的问题标题),您将需要查看此处:
http://www.djangosnippets.org/snippets/243/
查看 Oli 的链接。通过查看 request.META [5],您基本上可以看到 Django 中基本 HTTP 身份验证验证的经过身份验证的用户名。
**更新:**测试了 ticket #689的建议补丁,该补丁在 telenieko 的 git repository 这里中可用 up-to-date。它至少适用于 Django 的修订9084。
激活远程用户身份验证后端
在
AuthenticationMiddleware
之后添加RemoteUserAuthMiddleware
添加设置
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)
如果像我一样使用 lighttpd 和 FastCGI,请激活 mod_auth,为测试用户创建凭据(我称之为
testuser
并将123
设置为密码)并将 Django 站点配置为需要基本身份验证。以下
urls.py
可用于测试设置:重新加载 lighty 和 Django FCGI 服务器后,加载站点的根现在要求身份验证并接受
testuser
凭据,然后输出请求对象的转储。在 request.META 中应该存在以下新属性:/user/
URL 可用于检查您确实以testuser
身份登录:/users/
URL 现在列出了自动添加的testuser
(这里也是我在创建syncdb
时创建的admin
用户):如果您不想修补 Django,将
RemoteUserAuthBackend
和RemoteUserAuthMiddleware
类分离到一个单独的模块并在 Django 设置中引用它是微不足道的。有httpauth.py。我仍然是 Django 的完全新手,所以我不知道它是如何完全适合的,但它应该做你想要的。
编辑:这是关于这个主题的更长的错误线程。
因为 django 可以以多种方式运行,并且只有 modpython 可以让你与 Apache 紧密集成,所以我认为 django 没有办法让你在 Apache 的基本身份验证基础上登录。身份验证应该在应用程序级别完成,因为它将为您提供更多控制并且更简单。你真的不想在 Python 和 Apache 之间共享用户数据的麻烦。
如果您不介意使用修补版本的 Django,那么在http://www.djangosnippets.org/snippets/56/有一个补丁,它将为您提供一些支持基本身份验证的中间件。
基本身份验证非常简单 - 如果用户未登录,则返回 401 身份验证所需的状态代码。这会提示浏览器显示登录框。然后,浏览器将提供用户名和密码作为 bas64 编码的字符串。维基百科条目http://en.wikipedia.org/wiki/Basic_access_authentication非常好。
如果补丁没有达到您想要的效果,那么您可以很快自己实现基本身份验证。
这似乎是自定义
AuthenticationBackend
的任务 - 请参阅关于这个主题的 Django 文档,djangosnippets.org 有一些 real-life 这样的代码示例(请参阅1或2)(这并不是一件难事)。AuthenticationBackend
子类必须只定义 2 个方法,并且它们的代码非常简单:一个必须返回用户 ID 的 User 对象,第二个必须执行凭据检查并在凭据有效时返回 User 对象。