Django 身份验证在公共架构以外的架构上不起作用

Django 身份验证在公共架构以外的架构上不起作用,django,postgresql,database-schema,multi-tenant,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' 这在原

我试图在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

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

发生的情况如下:

  • mysite.com
    登录良好(模式:
    public
  • foo.mysite.com
    而不是登录将重定向(HTTP 302)回自身(
    foo.mysite.com
    )(架构:
    client\u foo

强制模式始终为
client\u foo
将导致
mysite.com
工作(即,登录
client\u foo
schema),但
foo.mysite.com
仍不工作


完全删除架构选择(使其始终处于
public
schema)将使两个URL都可以正常登录。

1)您是否正确设置了会话cookie以支持跨域会话?见:


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

“尝试从子域登录到管理应用程序会导致重定向回登录页”:这听起来不像是PostgreSQL问题。这里的问题是PostgreSQL不执行“重定向”会话。