13

共有が異なるサイトまたは異なるサブドメイン間で行われているかどうかに応じて、この質問に対する 2 つの回答 2番目の回答:複数の Django アプリ、共有認証

ユーザーが site1.com にアクセスしてログインします。ここで、ユーザーが site2.com にアクセスすると、そのサイトですでにログイン (認証) されているはずです。

site1.com と site2.com は、同じサーバー上の異なる Django アプリによって処理されます。

サイトが認証テーブルを含むデータベースを共有できることがわかりました。私が得られないのは、セッションデータがどのように処理されるかです。ユーザーは site1 にログインした後、site2 に移動します。ここで、彼は常に user_id の代わりに request.user = "AnonymousUser: AnonymousUser" を持っています。

ここに設定しました: https://docs.djangoproject.com/en/dev/topics/db/multi-db/ :

site1 の設定には、認証モデルとその他のデータ テーブルを含む単一のデータベースがあります。site2 の設定には 2 つのデータベースがあります。1 つは独自のデータ テーブルを持ち、1 つは user1 によって使用されます。基本的に、クラス AuthRouter をコピーし、データベース ルーターをセットアップしました。

私がやろうとしていることは不可能ですか?2 つのサイトがセッション データを共有する方法が実際にはわかりません。Django 以外に何か特別なものが必要ですか? または、これは機能するはずですか?ここにコードを含めることができますが、これに関する私の基本的な考え方が間違っている場合に問題を混乱させたくありません。

編集:これが私のセットアップです。私はローカルホストでこれを試しています。

Site1 は localhost:8080 で実行されています

site2 は localhost:8000 で実行されています

サイト 2 アプリ:

デシベルルーター.py:

class AuthRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'auth':
            return 'the_ui'
        return None
    # same for write

    def allow_syncdb(self, db, model):
        if db == 'the_ui':
            return model._meta.app_label == 'auth'
        elif model._meta.app_label == 'auth':
            return False
        return None

class OtherRouter(object):
    def db_for_read(self, model, **hints):
        return "default"
    # same for write, relation, syncdb

settings.py:

DATABASE_ROUTERS = ['site2_app.db_router.AuthRouter', 'site2_app.db_router.OtherRouter']
SESSION_COOKIE_DOMAIN = 'http://localhost:8080'
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"

DATABASES = {
    'default': {
        # ...
    },
    'the_ui': {
        # ...
    }
}

サイト 1 アプリ:

# no router
# only single database, same as the "the_ui" used in site2
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
4

4 に答える 4

20

異なるサイトを使用するという最初の質問に基づいて、マークされた回答は正しいです。

www.site.com と shop.site.com など、さまざまなサブドメインの答えは次のとおりです。

質問で説明されているように、共有データベース認証を使用します。そして、両方の settings.py で:

SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
SESSION_COOKIE_DOMAIN = '.site.com' #notice the period
SESSION_COOKIE_NAME = 'my_cookie'
SECRET_KEY = "" the same in both settings.py

この情報を共有してはならない他のサブドメインがある場合、どうなるかについて問題があるかもしれません。または、クッキーに別の名前を付けたら、そうではないでしょうか??

これがローカルホストで機能するかどうかはわかりません。

于 2013-08-15T08:10:07.620 に答える
3

あなたが言ったように、2 つのサイトは、データベースを共有するか、それぞれのデータベース間でユーザー テーブルを同期することにより、同じ認証データを持つことができます。

これにより、site1.com のユーザーは自動的に site2.com のメンバーになり、その逆も同様です。

しかし、site1.com にログインするすべてのユーザーが自動的に site2.com にログインする必要があるという要件は少しトリッキーです。本当に必要なのはシングル サインオン (SSO) です。

データベース (セッション データを含む) を共有するだけでは実現できないのは、クロス ドメインの問題により、site2.com がブラウザーで site1.com によって設定された Cookie にアクセスできないためです。

Django を使用した SSO ソリューションは多数あります。このSOの質問を見てください。私は使ったことはありませんが、Django-openidは良い選択肢のようです。

于 2013-08-14T14:12:54.270 に答える
0

データベースルーターを使用して、認証バックエンドに使用するデータベースを指定できます。

ここで、以下にルーターコードの例を示します。

class UserSessionRouter(object):

    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'auth':
            return 'usersandsessions'
        elif model._meta.app_label == 'accounts':
            return 'usersandsessions'
        elif model._meta.app_label == 'sessions':
            return 'usersandsessions'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'auth':
            return 'usersandsessions'
        elif model._meta.app_label == 'accounts':
            return 'usersandsessions'
        elif model._meta.app_label == 'sessions':
            return 'usersandsessions'
        return None

次に、以下に示すようにデータベース設定DATABASE_ROUTERSおよびSESSION_COOKIE_DOMAINを使用してルーターを指定します。

DATABASE_ROUTERS = ['site2.routers.UserSessionRouter']
SESSION_COOKIE_DOMAIN = 'site1.com'
于 2013-08-14T12:24:10.757 に答える