我们有一个在Apache上运行的网站,可以通过HTTP Basic身份验证保护访问的静态页面。
我已经使用Django内置的用户管理支持与Django一起编写了网站的新部分。
我的问题是用户必须通过HTTP Basic身份验证登录一次,然后再次使用Django登录表单。这既笨拙又使用户感到困惑。
我想知道是否有人找到了一种使用HTTP Basic身份验证信息使Django登录用户的方法。
我不希望将密码传递给Django,但是,如果用户dave
已通过Apache认证,那么他们也应该也自动以dave
身份登录到Django。
((一种选择是让Apache和Django共享用户存储以确保通用的用户名和密码,但这仍然涉及两个登录提示,这是我要避免的。)
这已添加到Django 1.3版本中。在这里查看更多当前文档:http://docs.djangoproject.com/en/dev/howto/auth-remote-user/
[仅在某些请求上支持基本身份验证(而不是在Web服务器上捣乱,这是某人可能会解释您的问题的标题),您需要在这里查看:
请检查Oli的链接。通过查看request.META ['REMOTE_USER'],您基本上可以看到Django中的基本HTTP验证所验证的已验证用户名。
更新:测试了票证#689的建议补丁,该补丁程序可在telenieko的git存储库here中获得。它至少适用于Django的修订版9084。
通过以下方式激活远程用户身份验证后端
RemoteUserAuthMiddleware
之后添加AuthenticationMiddleware
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)
如果像我一样使用lighttpd和FastCGI,请激活mod_auth,为测试用户创建凭据(我将其称为testuser
,并将123
设置为密码),并将Django站点配置为需要基本身份验证。
以下urls.py
可用于测试设置:
from django.conf.urls.defaults import *
from django.http import HttpResponse
from django.contrib.auth.models import User
urlpatterns = patterns('',
url(regex='^$',
view=lambda request: HttpResponse(repr(request), 'text/plain')),
url(regex='^user/$',
view=lambda request: HttpResponse(repr(request.user), 'text/plain')),
url(regex='^users/$',
view=lambda request: HttpResponse(
','.join(u.username for u in User.objects.all()),
'text/plain')),
)
重新加载lighty和Django FCGI服务器之后,现在加载站点的根目录要求进行身份验证并接受testuser
凭据,然后输出请求对象的转储。在request.META中,这些新属性应该存在:
'AUTH_TYPE': 'Basic'
'HTTP_AUTHORIZATION': 'Basic dGVzdHVzZXI6MTIz'
'REMOTE_USER': 'testuser'
/user/
URL可用于检查您是否确实以testuser
登录:
<User: testuser>
[/users/
URL现在列出了自动添加的testuser
(此处还显示了我在执行admin
时创建的syncdb
用户):
admin,testuser
[如果不想修补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 documentation on this subject,djangosnippets.org提供了此类代码的一些实际示例(请参见1或2)(这并不难) )。
AuthenticationBackend
子类只需要定义2个方法,它们的代码非常简单:一个必须返回User对象作为用户ID,第二个必须执行凭据检查并在凭据有效时返回User对象。
request.META包含其中存在您的自动化功能的键HTTP_AUTHORIZATION。
[如果您将apache与modWSGI一起使用,则密钥HTTP_AUTHORIZATION可能不存在。您需要在WSGI配置中添加以下行
WSGIPassAuthorization开
请参阅此详细答案:Passing apache2 digest authentication information to a wsgi script run by mod_wsgi
希望这对想知道为什么不存在HTTP_AUTHORIZATION密钥的人很有用