2009-10-17 61 views
12

我有两个网站foo.com和bar.com,都是基于Django的。主登记发生在foo.com(我想主要的用户数据库来这里),我想了三件事情发生:(Django)在两个不同域的网站上共享身份验证

对登录到foo.com

1)用户能自动确定访问bar.com不用再次登录

2)用户对登录到直接BAR.COM抵抗foo.com用户分贝认证。

3)用户无需直接在bar.com注册。

我该如何做到这一点?如果它大大简化了事情,我可以使bar.com成为foo.com的一个子域名(例如bar.foo.com),但它们必须是独立的站点。

回答

5

你的第三个要求,可以很容易地通过共享两个站点之间的同一个数据库(因此具有相同的用户表来解决。

的第一个要求是因为跨域问题棘手(会话cookie不会被共享。)

你真正寻找的是一个Single Sign On (SSO)你可能会考虑django-openid

+2

#2可以做一对夫妇的方式。正如John所说,#1是主要问题。 – 2009-10-17 15:09:49

4

这取决于您的要求。如果你能够,简单的解决方案是简单地将两个站点托管在一个Django实例上。换句话说,你的Django项目举办这两个网站,但你有一个网址rewrite rule映射foo.comhttp://localhost/foo/bar.comhttp://localhost/bar/。在这种情况下,Django的认证系统将“正常工作”。重写规则当然也适用于子域;我已经构建了一个使用这种技术来托管数百个子域的系统。

如果这并不像其他人所说的一个选项,你的Django实例之间共享数据库和设置SESSION_COOKIE_DOMAIN,应该工作。

+0

嗯,为什么要投票?这是处理全部共享相同数据的子域或域的完全自然的方式。 – 2009-10-18 01:37:07

+0

您的潜在解决方案当然不能保证得到满意的结果。 – 2011-07-08 19:17:58

+0

不知道为什么这会被投票,但这看起来像一个很好的答案,似乎正是我所需要的。希望这可以在django项目前使用nginx。 – paperreduction 2012-11-10 23:55:52

4

我有一个非常类似的问题,但OpenID对我来说不是一个可行的解决方案。随着django> 1.2中多个数据库的出现,跨站点共享会话和登录数据变得非常简单。 This blog post做了很好的解释如何建立它。希望其他人能够像我那样认为这很有用。 ,或通过使用服务器<=>服务器聊天直接访问其它数据库: