身份验证不适用于除public之外的架构

时间:2012-10-29 22:38:23

标签: django postgresql database-schema multi-tenant

我正在尝试在Django和PostgreSQL中实现一个多租户应用程序,每个租户都有一个单独的(但相同的)架构。

我选择租户架构:

cursor.execute('SET search_path TO ' + schemas)

我有一个中间件,根据主机名选择使用哪个架构,所以它可以这样工作:

foo.mysite.com --> use schema 'client_moo'
bar.mysite.com --> use schema 'client_bar'

原则上这是有效的,即在简单的情况下(简单的数据库查找)

但是,当我尝试登录时,事情开始崩溃。每个租户都应该有自己独立的登录页面,因此foo.mysite.com将与bar.mysite.com区别开来,与mysite.com不同{1}}。

但是,尝试从子域登录管理应用程序会导致重定向回登录页面。

以下是发生的事情:

  • mysite.com正常登录(架构:public
  • foo.mysite.comn而不是登录会将重定向(HTTP 302)重定向回自身(foo.mysite.com)(架构:client_foo

强制架构始终为client_foo将导致mysite.com正常工作(即登录client_foo架构),但foo.mysite.com仍无效。< / p>


完全删除模式选择(以便它始终位于public模式上)将使两个URL都正常登录。

1 个答案:

答案 0 :(得分:1)

1)您是否正确设置了会话cookie以支持跨域会话?请参阅:https://docs.djangoproject.com/en/dev/topics/http/sessions/#session-cookie-domain

2)如果您正在使用数据库会话存储(这是默认设置),那么切换模式很可能会导致Django无法从数据库中获取会话(取决于您的中间件的顺序)。