0

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.comnログインする代わりに、リダイレクト (HTTP 302) を自分自身 ( foo.mysite.com) (スキーマ: client_foo)に戻します。

スキーマを常にあるように強制するclient_fooと、mysite.com機能する (つまり、client_fooスキーマにログインする)ことになりますが、foo.mysite.comそれでも機能しません。


スキーマの選択を完全に削除すると (常にpublicスキーマ上にあるように)、両方の URL が正常にログインできるようになります。

4

1 に答える 1

1

1) クロスドメイン セッションをサポートするために、セッション Cookie を適切に設定しましたか? 参照: https://docs.djangoproject.com/en/dev/topics/http/sessions/#session-cookie-domain

2) DB セッション ストレージ (デフォルト) を使用している場合、スキーマを切り替えると、Django がデータベースからセッションを取得できなくなる可能性が高くなります (ミドルウェアの順序によって異なります)。

于 2012-11-03T00:11:41.920 に答える