代码之家  ›  专栏  ›  技术社区  ›  David Webb

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

  •  36
  • David Webb  · 技术社区  · 16 年前

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

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

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

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

    我不希望向Django传递密码,而是希望用户 dave 已经过Apache的身份验证,然后它们应该自动以身份登录到Django 戴夫 也是。

    (一种选择是让Apache和Django共享一个用户存储区,以确保通用的用户名和密码,但这仍然需要两个登录提示,这正是我试图避免的。)

    6 回复  |  直到 10 年前
        1
  •  24
  •   Traveler    13 年前

    这已添加到django 1.3版本中。有关此内容,请参阅更多当前文档: http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

        2
  •  34
  •   wsorenson    15 年前

    为了只支持对某些请求的基本授权(而不是与Web服务器进行干扰——这是有人可能解释您的问题标题的方式),您需要查看以下内容:

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

        3
  •  10
  •   akaihola dnlcrl    16 年前

    一定要查看奥利的链接。您基本上可以通过查看request.meta['remote_user']在Django中看到基本HTTP身份验证验证的用户名。

    更新: 已测试建议的票修补程序 #689 在Telenieko的Git存储库中提供最新版本 here . 它至少适用于修订版 9084 Django。

    通过激活远程用户身份验证后端

    • 添加 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服务器之后,加载站点的根目录现在请求身份验证并接受 测试用户 凭证,然后输出请求对象的转储。在request.meta中,这些新属性应该存在:

    'AUTH_TYPE': 'Basic'
    'HTTP_AUTHORIZATION': 'Basic dGVzdHVzZXI6MTIz'
    'REMOTE_USER': 'testuser'
    

    这个 /user/ URL可用于检查您是否确实以 测试用户 :

    <User: testuser>
    

    以及 /users/ URL现在列出自动添加的 测试用户 (这里) admin 我创建的用户 syncdb 还示出:

    admin,testuser
    

    如果你不想修补django,分离 RemoteUserAuthBackend 远程用户授权中间件 类到一个单独的模块中,并参考Django设置中的模块。

        4
  •  3
  •   Oli    16 年前

    httpauth.py . 我对姜戈还是个新手,所以我不知道它到底是如何适应的,但它应该能满足你的需求。

    编辑:这里是 a longer bug thread on the subject .

        5
  •  0
  •   Andrew Wilkinson    16 年前

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

    如果您不介意使用补丁版本的django,那么在 http://www.djangosnippets.org/snippets/56/ 这将为您提供一些中间件来支持基本认证。

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

    如果补丁不做您想要的,那么您可以很快地实现基本身份验证。

        6
  •  0
  •   zgoda    16 年前

    这似乎是自定义任务 AuthenticationBackend -见 Django documentation on this subject ,djangosnippets.org有一些此类代码的实际示例(请参见 1 2 )(这并不是什么难事)。

    身份验证后端 子类只能定义两个方法,它们的代码非常简单:一个方法必须返回用户ID的用户对象,另一个方法必须执行凭据检查,如果凭据有效,则返回用户对象。