サイト間でユーザーとその役割を同期するにはどうすればよいですか?


7

マルチサイトのDrupalインストールをセットアップしました。メインサイトはexample.comで、a.example.comとb.example.comもあります。

私はexample.comを所有しており、a.example.comを個人Aに、b.example.comを個人Bに貸し出しています。彼らは私のサイトのUberCartロール購入機能を使用してサイトの家賃を支払います。個人AとBがexample.comにログインしてサイトの家賃を支払い、アップグレードされたロールをa.example.comとb.example.comにも自動的に転送できるようにサイトを設定する方法が必要ですそのため、1か月後にUbercartが役割をダウングレードした場合に、手動で割り当てを解除する必要はありません。

私が試したこと:

  1. 共有ユーザーテーブル。Person Aがb.example.comにサインアップした人を見ることができないようにしたいので、これは機能しません。共有ユーザーサイトは、誰もがすべてを見ることができることを意味します。

  2. ドメインアクセス。これは問題なく動作しますが、実際には不安定です。将来的にはz.example.com以降に移行する予定です。そのため、私が考えていた以上の分離を保つ方法がない限り、これは考えていません。実現可能です。たとえば、各サイトに「会社概要」ページがある場合、uid = 1アカウントから26件の「会社概要」ページが表示されます。さらに、UberCartモジュールを思い通りに分離する方法はありませんでした。Ubercartマーケットプレイスは、私が設計したように手数料を取っていないため、立ち入り禁止です。UC_Domainはまだdrupal 7にアップグレードされていません。

  3. アカウント同期。これは最も近いように見えましたが、プラグインが壊れているように見え、試してみると大量のXML-RPCエラーが発生します。通常、説明どおりに機能せず、壊れる前に最初のアカウントのみを同期するようです。Googleがエラーを検索しても、XMLRPCが潜在的に危険であるという警告以外は何も返されません。

  4. ベーカリー。これはすばらしいように見えますが、残念ながらサブサイト間で役割を共有していません。私はそれを追加しようとしていましたが、時間を費やす前に、これに対処できる他の方法があるかどうかを確認したいと思いました

誰かが私に知らせて何かについて説明が必要な場合は、私は本当にこれを解決したいと思っていますが、オンラインで何かを見つけることができません。


これを行う最も簡単な方法は、機能を使用してロールをエクスポートすることです。機能
Mohammad AlQanneh 2016年

回答:


1

問題がDrupal 7以下のものであることを願っています。Drupal 8の場合、解決策はほぼ不可能です。また、将来のDrupalバージョンでは、Drupal 9の現在の計画に従って、マルチサイトオプション自体は使用できなくなります。つまり、Drupalのデフォルトオプションを使用してユーザーロールを共有することは明らかに不可能です。

Drupal 7以下では、マルチサイト設定で、コンテンツごとに異なるデータベースを使用するように各サイトを構成し、ユーザー、ロール、セッションなどのためだけに(同じデータベースから)同じテーブルを共有することが非常に簡単に可能です。ユーザーを共有するのではなく、役割のみを共有したい場合でも、それは可能です。このため、サイトAとサイトBのsettings.phpは次のようにする必要があります。

サイトAのsettings.php:

/*
 * Database Settings for 'Site A'
 */
$databases['default']['default'] = array (
    'database' => 'site_a_db_name',    // Specify Site A's main database name
    'username' => 'site_a_db_username',
    'password' => 'site_a_db_password',
    'prefix' => array(
        'default' => 'site_a_prefix_',    // Prefix for all tables in Site A's main database (specified above), other than for the tables specified below
        'role' => 'shared_db_name.shared_prefix_',              // Shared database name and prefix for the 'role' table
        'users' => 'shared_db_name.shared_prefix_',             // Shared database name and prefix for the 'users' table
        'authmap' => 'shared_db_name.shared_prefix_',           // Shared database name and prefix for the 'authmap' table
        'sessions' => 'shared_db_name.shared_prefix_',          // Shared database name and prefix for the 'sessions' table
        'profile_fields' => 'shared_db_name.shared_prefix_',    // Shared database name and prefix for the 'profile_fields' table
        'profile_values' => 'shared_db_name.shared_prefix_',    // Shared database name and prefix for the 'profile_values' table
    ),
    'host' => 'localhost',
    'port' => '3306',
    'driver' => 'mysql',
    'collation' => 'utf8mb4_general_ci',
);

サイトBのsettings.php:

/*
 * Database Settings for 'Site B'
 */
$databases['default']['default'] = array (
    'database' => 'site_b_db_name',    // Specify Site B's main database name
    'username' => 'site_b_db_username',
    'password' => 'site_b_db_password',
    'prefix' => array(
        'default' => 'site_b_prefix_',    // Prefix for all tables in Site B's main database (specified above), other than for the tables specified below
        'role' => 'shared_db_name.shared_prefix_',              // Shared database name and prefix for the 'role' table
        'users' => 'shared_db_name.shared_prefix_',             // Shared database name and prefix for the 'users' table
        'authmap' => 'shared_db_name.shared_prefix_',           // Shared database name and prefix for the 'authmap' table
        'sessions' => 'shared_db_name.shared_prefix_',          // Shared database name and prefix for the 'sessions' table
        'profile_fields' => 'shared_db_name.shared_prefix_',    // Shared database name and prefix for the 'profile_fields' table
        'profile_values' => 'shared_db_name.shared_prefix_',    // Shared database name and prefix for the 'profile_values' table
    ),
    'host' => 'localhost',
    'port' => '3306',
    'driver' => 'mysql',
    'collation' => 'utf8mb4_general_ci',
);

上記のコードに示すように、「prefix」配列の下で、サイトで使用される異なるテーブルごとに個別のデータベースとプレフィックスを指定できます。'prefix'配列で排他的に指定されているテーブル以外のすべてのテーブルでは、 'default'として指定されたプレフィックスが使用されます。

Drupal 8では、ユーザー/ロール/セッションの共有はDrupal 7ほど簡単ではありません。Drupal8では、ユーザーロールを含む多くの情報が共有テーブルの一部であるためです(この共有テーブルは多くの異なる情報を格納するためのものです)変数値、および役割はその一部にすぎません)。


0

各サイトのユーザーロールを管理するすべてのサイトで、セカンダリデータベース(または特定のテーブル)を使用できます。次に、次のことを行う必要があります。

  • 各サイト(az).example.comのcronジョブを定義します。これはデータベースを検索し、サイト上のユーザーのロールを更新します
  • 人々がexample.comで購入したときにデータベースを更新する
  • UberCartトランザクションの完了後にexample.comからcronをトリガーします

これを行うもう1つの方法は、サブサイトでPOST(REST)Webサービスエンドポイントを公開し、送信されたデータに基づいてロールを更新する機能をトリガーすることです。次に、UberCartトランザクションの後にそのエンドポイントを呼び出します。

どちらの場合も、UberCartトランザクション(またはおそらくルールのようなもの)の後に何かを行うために使用できるフックがあると想定しています。


0

あまり開発したくない場合の最も簡単な方法は、テーブルの共有について少し変更することです。

https://www.drupal.org/node/22267

ただし、ロールを共有するだけの場合は、ロールテーブルを使用します。

これはあなたが使える例です:

$db_prefix = array(
    "default" => "slave1_", // the prefix for tables that are not shared.
    "role" => "master_",
); 

0

追加のデータベースを作成します。独自のdrupalインスタンスまたはyiiのようなphpフレームワークであり、独自のデータベースをモデル化できます。そこであなたはアカウントデータを管理します。そこから、cronjob(REST呼び出しなど)を介してロールを同期します。アカウント資格情報データをロードした後、この2つのDrupal API関数を使用してアカウント資格情報を更新します。

このアプローチは、完成したモジュールを探しているだけでなく、あなたのために働く仕事をします。次に、あなたを助けるコーダーをより良くします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.