Django:是否有一种安全可靠的方式允许帐户持有人在您的应用上拥有单独的域名?

时间:2010-02-10 22:26:12

标签: django web-applications multiple-domains

如果我希望我的帐户持有人能够拥有自己的子域名,甚至是他们自己的域名。使用NGINX作为我的代理服务器,我应该在NGINX conf中为每个域创建域名,并让我的客户在那里指出他们的域名,还是有理由说这会是坏事?另外,如果我这样做,我如何通过请求传递特定于帐户的(Django DB中的帐户)信息(即,从www.spamfoosaccount.com请求到我的服务器,所以我将请求代理回Apache,但是如何我的应用程序是否知道它来自spamfoo的帐户,除非我查看request.HTTP_HOST(这可能是最好的方式,但在我问之前我不知道)。提前致谢。

1 个答案:

答案 0 :(得分:1)

要知道请求来自哪个域,您必须使用request.META["HTTP_HOST"]

但是,不要依赖此值进行身份验证,它可以轻松伪造。身份验证应以django.contrib.session的常规方式完成。即使请求包含经过身份验证的会话,来自特定域/子域的请求也不应具有更多权限/权限。特权应该提供给用户/用户组,而不是域。

请注意,浏览器会话不能跨越二级域名(例如来自foo.com的会话cookie不会被发送到bar.com),但它可以是所有子域名的* .foo.com cookie(如果您明确说明的话)这样设置。)

让您的用户将他们的DNS记录指向您服务器的IP,让NGINX将基于域的请求路由到您的后端,并在Django中进行正常身份验证。

你的问题:

  

我的应用程序如何知道它   来自spamfoo的帐户

我不知道您的应用程序的具体细节,但请求来自哪里,但发出请求的人(例如经过身份验证的用户)无关紧要。您应该有一个模型/字段,将您的用户链接到各自的域。当用户仅链接到一个域时,应用程序应假定用户来自该域。当用户连接到多个域时,您可以查看request.META["HTTP_HOST"]。如果此值与任何域匹配,则用户链接到,没关系,该值可能是伪造的,但仍然是由链接到该域的用户。