我可以在Django中使用HTTP基本身份验证吗?

时间:2020-03-06 14:54:49  来源:igfitidea点击:

我们有一个在Apache上运行的网站,该网站具有许多通过HTTP Basic身份验证保护的静态页面。

我已经使用Django内置的用户管理支持与Django一起编写了网站的新部分。

我的问题是用户必须通过HTTP Basic身份验证登录一次,然后再次使用Django登录表单。这既笨拙又使用户感到困惑。

我想知道是否有人找到一种使Django使用HTTP Basic身份验证信息登录用户的方法。

我不希望将密码传递给Django,但是,如果用户dave'已通过Apache身份验证,则他们也应自动以dave`身份登录到Django。

(一种选择是使Apache和Django共享用户存储,以确保通用的用户名和密码,但这仍将涉及两个登录提示,这是我要避免的提示。)

解决方案

有httpauth.py。我仍然是Django的新手,所以我不知道它的确切位置,但是它应该可以满足需求。

编辑:这是关于该主题的更长的bug线程。

因为django可以以多种方式运行,并且只有modpython可以使我们与Apache紧密集成,所以我不认为django可以通过Apache的基本身份验证来登录我们。身份验证实际上应该在应用程序级别完成,因为它将为我们提供更多控制权,并且将更加简单。我们确实不希望在Python和Apache之间共享用户数据的麻烦。

如果我们不介意使用Django的补丁版本,则可以在http://www.djangosnippets.org/snippets/56/上找到一个补丁,该补丁将为我们提供一些支持基本auth的中间件。

如果用户未登录,则基本身份验证实际上非常简单,我们将返回401身份验证所需的状态代码。这会提示浏览器显示一个登录框。然后,浏览器将提供用户名和密码作为bas64编码的字符串。维基百科条目http://en.wikipedia.org/wiki/Basic_access_authentication非常好。

如果补丁不能满足要求,那么我们可以自己快速实施基本身份验证。

请查看Oli的链接。通过查看request.META ['REMOTE_USER'],我们基本上可以看到Django中的基本HTTP身份验证所验证的已验证用户名。

更新:测试了建议的票证编号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,将RemoteUserAuthBackendendRemoteUserAuthMiddleware类分离到一个单独的模块中并在Django设置中进行引用是很简单的。

这似乎是自定义AuthenticationBackend的任务,请参阅有关此主题的Django文档,djangosnippets.org提供了此类代码的一些实际示例(请参见1或者2)(这并不是一件很难的事)。

AuthenticationBackend子类只需要定义两个方法,它们的代码非常简单:一个必须返回User对象作为用户ID,第二个必须执行凭据检查并在凭据有效时返回User对象。

对于仅在某些请求上支持基本身份验证(而不是在Web服务器上捣乱-某人可能会解释问题标题的方式),我们将需要在这里查看:

http://www.djangosnippets.org/snippets/243/