Django和Apache HTTP基本认证(和REMOTE_USER)

92 阅读3分钟

我们有一个Django应用程序,它的一部分存在于Apache HTTP Basic认证的背后。由于超出本条目范围的原因,我最近重新发现了一些关于Django如何与Apache HTTP Basic Authentication互动的事情,所以我想在我再次忘记它们之前为自己写下来。

首先,在Django文档中,这个问题的起点不是搜索'HTTP Basic Authentication'或类似的东西,而是搜索关于用REMOTE_USER也就是Apache在已经认证过的东西时注入的环境变量的操作方法。我相信,如果你在搜索引擎上搜索 "Django "与 "Basic Authentication",你往往会得到关于使Django或Django相关的东西实际执行HTTP Basic认证本身的服务器端的信息。 这很公平,但可能会令人困惑。

REMOTE_USER 其次,只有当你想使用Django自己的认证时,你才需要配置Django本身的认证,例如在其管理站点的访问和授权。 在你的Apache配置中使用Apache的HTTP Basic认证来认证和限制对你的Django站点(或部分站点)的访问是完全有效的(尽管可能很烦人),但有一个单独的Django登录步骤来访问Django管理站点或甚至你应用程序的部分(然后将用cookies等进行追踪)。如果你想这样做,你就不要把Django的RemoteUserMiddleware等加入你的Django设置中。

(你将不得不分别管理Apache用户和Django用户,包括密码,而且它们不是同一件事。这可能会让人感到困惑)。

如果你让Django用REMOTE_USER来认证,你需要你的Django数据库超级用户是你可以通过Apache来认证的。如果你巧妙地将你的数据库超级用户设置为 "admin",但你的Basic Auth数据库中却没有 "admin",你就会很难过。有可能通过一些方法让自己摆脱这种情况,但最好是一开始就避免它。

(当你让Django以这种方式认证时,每个通过HTTP基本认证使用你的Django应用程序的人都会在Django的 "用户 "表中留下一个条目。清除不再存在的旧登录信息是由你决定的,如果你关心的话。对于你希望能够使用Django管理站点的人,你需要在Django用户表中至少将他们设置为'工作人员'。你也可以把他们设置为数据库超级用户(superusers)。

只要Apache的HTTP基本认证处于激活状态,就没有必要为了自己利用认证信息而使用Django的REMOTE_USER支持。你可以像我们一样,从$REMOTE_USER 环境变量中获取登录名,并在自己的 "用户 "表中手工查找它。你可能想也可能不想为新用户自动创建新条目,就像Django默认的那样。我们不这样做是因为新用户需要在我们这边进行一些额外的配置。

这方面的推论是,你可以在Apache HTTP Basic认证下使用和测试你的整个网站,而不需要将Django正确地连接到使用REMOTE_USER ,而不会注意到。我相信这可能很重要,因为我相信当你启用了RemoteUser*的时候,Django对会话的处理是不同的,这与Django的CSRF保护相互影响。