首页 文章

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

提问于
浏览
37

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

我使用 Django 内置的用户管理支持,用 Django 编写了网站的新部分。

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

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

我不希望将密码传递给 Django,而是如果用户dave已经被 Apache 验证,那么它们也应该自动登录到 Django dave

(一种选择是让 Apache 和 Django 共享一个用户存储来确保常见的用户名和密码,但这仍然会涉及两个登录提示,这就是我想要的 avoid.)

6 回答

  • 24

    这已被添加到 Django 1.3 版本中。在此处查看更多当前文档:http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

  • 34

    对于仅支持某些请求的基本身份验证(而不是与 Web 服务器混淆 - 这是某人可能解释您的问题标题),您将需要查看此处:

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

  • 10

    查看 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可用于测试设置:

    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,将RemoteUserAuthBackendRemoteUserAuthMiddleware类分离到一个单独的模块并在 Django 设置中引用它是微不足道的。

  • 3

    httpauth.py。我仍然是 Django 的完全新手,所以我不知道它是如何完全适合的,但它应该做你想要的。

    编辑:这是关于这个主题的更长的错误线程

  • 0

    因为 django 可以以多种方式运行,并且只有 modpython 可以让你与 Apache 紧密集成,所以我认为 django 没有办法让你在 Apache 的基本身份验证基础上登录。身份验证应该在应用程序级别完成,因为它将为您提供更多控制并且更简单。你真的不想在 Python 和 Apache 之间共享用户数据的麻烦。

    如果您不介意使用修补版本的 Django,那么在http://www.djangosnippets.org/snippets/56/有一个补丁,它将为您提供一些支持基本身份验证的中间件。

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

    如果补丁没有达到您想要的效果,那么您可以很快自己实现基本身份验证。

  • 0

    这似乎是自定义AuthenticationBackend的任务 - 请参阅关于这个主题的 Django 文档,djangosnippets.org 有一些 real-life 这样的代码示例(请参阅12)(这并不是一件难事)。

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

相关问题