我可以在Django中使用HTTP基本认证吗?
我们有一个运行在Apache上的网站,其访问通过HTTP基本认证保护了许多静态页面。
我使用Django构建了支持用户管理的Django,并使用Django编写了该网站的新部分。
我遇到的问题是用户必须通过HTTP Basic身份验证登录一次,然后再次使用Django登录表单登录。 这对用户来说既笨拙又令人困惑。
我想知道是否有人找到了让Django登录用户使用HTTP基本认证信息的方法。
我不希望将密码传递给Django,而是如果用户dave
已经通过Apache认证,那么他们也应该自动以dave
身份登录到Django。
(一种选择是让Apache和Django共享一个用户存储以确保通用的用户名和密码,但这仍然会涉及到两个登录提示,这是我试图避免的。)
这已添加到Django 1.3版本中。 在这里查看更多当前文档:http://docs.djangoproject.com/en/dev/howto/auth-remote-user/
对于仅支持基于某些请求的基本身份验证(而不是使用Web服务器 - 这可能是某人可能会解释问题标题的方式),您可能需要查看以下内容:
http://www.djangosnippets.org/snippets/243/
检查Oli的链接。 通过查看request.META ['REMOTE_USER'],您基本上可以看到通过基本HTTP身份验证在Django中验证的经过身份验证的用户名。
更新:测试建议的补丁#689,该补丁在telenieko的git仓库中最新发布。 它至少适用于Django的修订版9084。
通过激活远程用户认证后端
AuthenticationMiddleware
之后添加RemoteUserAuthMiddleware
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
(这里是我在创建syncdb
时创建的admin
用户):
admin,testuser
如果您不想修补Django,将RemoteUserAuthBackend
和RemoteUserAuthMiddleware
类分离到一个单独的模块并在Django设置中引用它是很简单的。
上一篇: Can I use HTTP Basic Authentication with Django?
下一篇: Getting session info from subdomains to the parent domain [Django]