【问题标题】:Authentication will not work on schema other than public身份验证不适用于公共以外的架构
【发布时间】:2012-11-03 08:11:41
【问题描述】:

我正在尝试在 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

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

会发生什么:

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

强制架构始终为client_foo 将导致mysite.com 工作(即登录client_foo 架构),但foo.mysite.com 仍然无法工作。


完全删除架构选择(使其始终位于public 架构上)将使两个 URL 都能正常登录。

【问题讨论】:

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

标签: django postgresql database-schema multi-tenant


【解决方案1】:

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

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

【讨论】:

  • 会话是这里的问题。
猜你喜欢
  • 2016-08-04
  • 2021-12-11
  • 2021-01-21
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2017-10-10
  • 2010-11-05
相关资源
最近更新 更多