我们有一个网站上运行的阿帕奇,访问其中有一个数字的静态网页的保护通过HTTP基本的认证。

我已经写了一个新的组成部分,该网站与Django使用Django是建立在支持用户管理。

我的问题是,用户必须登录在一旦通过HTTP基本的认证,然后再次使用它登录的形式。这两个笨拙的和非常令人困惑的用户。

我想知道,如果任何人都不得不找到一种方法,使Django日志中的用户使用HTTP基本身份验证的信息。

我不期待通过一个密码Django,而是如果一个用户 dave 已经过身份验证通过阿帕奇然后他们应该被自动记录成为Django dave 太。

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

有帮助吗?

解决方案

这已添加到Django 1.3版本中。在此处查看更多当前文档: http://docs.djangoproject.com/en/dev/howto/ AUTH-远程用户/

其他提示

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

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

做检查了奥利的链接。你基本上看到过验证的用户名作为验证通过HTTP基本的认证,在决通过查看的请求。元['REMOTE_USER'].

更新: 测试的拟议修补票 #689, ,这是可以期在telenieko文件的储存库 在这里,.它适用干净至少在修订 9084 Django.

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

  • 加入 RemoteUserAuthMiddlewareAuthenticationMiddleware
  • 增加的设定 AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

如果您使用的程序和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')),
)

后重新装载莱蒂和Django FCGI服务器、装载的根源网站现在要求进行认证和接受的 testuser 凭证,然后输出的一个倾倒的请求对象。在请求。元这些新的特性应当:

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

/user/ URL可以用来检查,你确实记录在作为 testuser:

<User: testuser>

/users/ URL现在列出了自动加入 testuser (这里的 admin 用户我已经创建的时候做 syncdb 也是所示):

admin,testuser

如果你不想补Django,这是琐碎的分离 RemoteUserAuthBackendRemoteUserAuthMiddleware 类为一个独立的模块,并参考,在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文档,djangosnippets.org有一些这类代码的现实例子(参见 1 2 )(这不是一件很难的事)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top