我有两个网站说foo.com和bar.com都是基于Django的。主要注册发生在foo.com上(我希望主要用户数据库在这里),我希望有三件事情发生:
1)登录foo.com的用户无需再次登录即可自动访问bar.com
2)直接登录bar.com的用户将通过foo.com用户db。
进行身份验证3)用户无需直接在bar.com注册。
我怎样才能做到这一点?如果它大大简化了我可以使bar.com成为foo.com的子域名(例如bar.foo.com),但它们必须是独立的站点。
答案 0 :(得分:5)
通过在两个站点之间共享相同的数据库,可以轻松解决您的第三个要求(因此具有相同的用户表。
由于跨域问题,第一个要求很棘手(会话cookie不会被共享)。
你真正想要的是Single Sign On (SSO)。您可以考虑django-openid。
答案 1 :(得分:5)
这取决于您的要求。如果你能够,简单的解决方案就是在一个Django实例上简单地托管两个站点。换句话说,您的Django项目托管两个网站,但您有一个网址rewrite rule,可将foo.com
映射到http://localhost/foo/
,将bar.com
映射到http://localhost/bar/
。在这种情况下,Django的auth系统将“正常工作”。重写规则当然也适用于子域;我已经构建了一个使用这种技术托管数百个子域的系统。
如果这不是一个选项,那么在Django实例和设置SESSION_COOKIE_DOMAIN
之间共享数据库,如其他人所提到的,应该可以正常工作。
答案 2 :(得分:4)
我有一个非常类似的问题,但OpenID对我来说不是一个可行的解决方案。随着django> 1.2中多个数据库的出现,现在可以非常轻松地跨站点共享会话和登录数据。 This blog post很好地解释了如何设置它。希望其他人认为这和我一样有用。
答案 3 :(得分:0)
我认为你要找的是SESSION_COOKIE_DOMAIN
设置。你可以这样设置:
SESSION_COOKIE_DOMAIN = 'foo.com'
有关详细信息,请参阅http://docs.djangoproject.com/en/dev/topics/http/sessions/#session-cookie-domain。这确实假设两个应用程序都使用相同的会话存储后端。