Wie synchronisiere ich Benutzer und ihre Rollen zwischen Websites?

7

Ich habe eine Drupal-Installation mit mehreren Standorten eingerichtet. Die Hauptseite ist example.com und wir haben auch a.example.com und b.example.com.

Ich besitze example.com und vermiete a.example.com an Person A und b.example.com an Person B. Sie zahlen ihre Site-Miete über die UberCart-Funktion zum Kauf von Rollen auf meiner Site. Ich benötige eine Möglichkeit, meine Website so einzurichten, dass sich Person A und B bei example.com anmelden und ihre Website-Miete bezahlen können. Außerdem kann die aktualisierte Rolle automatisch auf a.example.com und b.example.com übertragen werden Wenn Ubercart nach einem Monat seine Rolle herabstuft, muss ich sie nicht manuell aufheben.

Dinge, die ich versucht habe:

  1. Tabelle für freigegebene Benutzer . Dies funktioniert nicht, weil ich nicht möchte, dass Person A Personen sehen kann, die sich für b.example.com angemeldet haben, und eine gemeinsam genutzte Benutzerseite bedeutet, dass jeder alles sehen kann.

  2. Domänenzugriff . Das funktioniert in Ordnung, ist aber sehr wackelig, und ich plane, in Zukunft zu z.example.com und weiter zu wechseln. Wenn es also keine Möglichkeit gibt, die Dinge getrennter zu halten, als ich es konnte, denke ich nicht ist machbar. Wenn zum Beispiel jede Site eine Seite "Über uns" hat, werden in meinem Konto "uid = 1" 26 Seiten "Über uns" angezeigt. Außerdem habe ich keine Möglichkeit gesehen, das UberCart-Modul so weit zu trennen, wie ich möchte. Der Ubercart Marketplace ist ein No-Go, da ich keine Provision nehme, wie sie entwickelt wurde, und UC_Domain noch nicht auf Drupal 7 aktualisiert wurde.

  3. Kontosynchronisierung . Dies schien am nächsten zu sein, aber das Plugin scheint kaputt zu sein. Ich bekomme Unmengen von XML-RPC-Fehlern, wenn ich es versuche. Im Allgemeinen funktioniert es nicht wie beschrieben und scheint nur das erste Konto vor dem Bruch zu synchronisieren. Die Google-Suche nach den Fehlern bringt nichts zurück, außer Warnungen, dass XMLRPC potenziell gefährlich ist.

  4. Bäckerei . Dies scheint großartig zu sein, teilt jedoch leider keine Rollen zwischen Unterwebsites. Ich habe versucht, das hinzuzufügen, aber bevor ich die Zeit damit verbracht habe, wollte ich sehen, ob es einen anderen Weg gibt, wie ich das machen kann

Wenn jemand eine Klärung benötigt, lass es mich wissen, ich möchte das wirklich lösen und kann online nichts finden.

user24601
quelle
Am einfachsten ist es, Rollen über Features zu exportieren. Eigenschaften
Mohammad AlQanneh

Antworten:

1

Hoffe, die Frage ist für Drupal 7 oder weniger. Wenn es sich um Drupal 8 handelt, ist die Lösung nahezu unmöglich. Und für zukünftige Drupal-Versionen ist gemäß dem aktuellen Plan für Drupal 9 die Option für mehrere Standorte selbst nicht verfügbar, was bedeutet, dass die gemeinsame Nutzung der Benutzerrolle mithilfe der Standardoptionen von Drupal eindeutig unmöglich ist.

In Drupal 7 oder niedriger ist es im Setup für mehrere Standorte sehr einfach möglich, jeden Standort so zu konfigurieren, dass für seinen Inhalt unterschiedliche Datenbanken verwendet werden, und dieselbe Tabelle (aus derselben Datenbank) nur für Benutzer, Rollen, Sitzungen usw. freizugeben Sie möchten keine Benutzer freigeben, sondern nur Rollen, auch wenn dies möglich ist. Dazu muss die settings.php für Site A und Site B wie folgt sein:

settings.php für Site A:

/*
 * 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',
);

settings.php für Site B:

/*
 * 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',
);

Wie im obigen Code gezeigt, können wir unter 'Präfix'-Array für jede auf der Site verwendete Tabelle eine separate Datenbank und ein separates Präfix angeben. Abgesehen von den Tabellen, die ausschließlich im Array 'Präfix' angegeben sind, wird für alle anderen Tabellen das als 'Standard' angegebene Präfix verwendet.

In Drupal 8 ist die gemeinsame Nutzung von Benutzern, Rollen und Sitzungen nicht so einfach wie in Drupal 7, da in Drupal 8 viele Informationen, einschließlich der Benutzerrollen, Teil einer gemeinsam genutzten Tabelle sind (diese gemeinsam genutzte Tabelle dient zum Speichern vieler verschiedener Tabellen Variablenwerte und Rollen sind nur ein Teil davon.

Binu Raman
quelle
0

Sie können eine sekundäre Datenbank (oder eine bestimmte Tabelle) für alle Ihre Sites verwenden, auf denen Sie die Benutzerrollen der einzelnen Sites verwalten. Sie müssten dann:

  • Definieren Sie für jede Site (az) .example.com einen Cron-Job, der die Datenbank durchsucht und die Rollen der Benutzer auf der Site aktualisiert
  • Aktualisieren Sie die Datenbank, wenn Leute auf example.com kaufen
  • Lösen Sie cron von example.com aus, nachdem die UberCart-Transaktion abgeschlossen ist

Die andere Möglichkeit besteht darin, einen POST-Webdienstendpunkt (REST) ​​auf den Unterwebsites bereitzustellen, der eine Funktion zum Aktualisieren der Rollen basierend auf den übermittelten Daten auslöst. Sie rufen diesen Endpunkt dann nach der UberCart-Transaktion auf.

In beiden Fällen gehe ich davon aus, dass es einen Hook gibt, mit dem Sie nach einer UberCart-Transaktion (oder vielleicht nach Regeln) Dinge erledigen können.

Yusuf
quelle
0

Der einfachste Weg, wenn Sie nicht so viel entwickeln möchten, ist ein wenig über das Teilen von Tabellen zu ändern:

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

Wenn Sie jedoch nur Rollen gemeinsam nutzen möchten, lesen Sie einfach die Rollentabelle.

Dies ist das Beispiel, das Sie verwenden können:

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

Erstellen Sie eine zusätzliche Datenbank. Kann eine eigene Drupal-Instanz oder ein PHP-Framework wie yii sein, in dem Sie die Datenbank selbst modellieren können. Dort verwalten Sie die Kontodaten. Von dort aus synchronisieren Sie die Rollen über einen Cronjob (zB einen REST-Aufruf). Nachdem Sie die Anmeldeinformationen des Kontos geladen haben, verwenden Sie diese beiden Drupal-API-Funktionen, um die Anmeldeinformationen des Kontos zu aktualisieren:

Dieser Ansatz erledigt den Job, wenn Sie nicht nur nach einem fertigen Modul suchen, das den Job für Sie erledigt. Dann bekommst du besser einen Programmierer, der dir hilft.

Jepster
quelle