Drupal Multisite Installation - Gemeinsame Benutzerdatenbank (User table sharing)

Der Drupal Slogan "Community plumbing" ist nicht einfach aus der Luft gegriffen. Eine extrem wertvolle Eigenschaft ist die sogenannte Multisite Installation. Im ersten Teil zu diesem Thema bin ich auf die Grundlagen der Einrichtung eines solchen Systems eingegangen. Diesmal gehts um etwas spezifischeres: die gemeinsame Benutzerdatenbank, auch "User table sharing" genannt

Angenommen man möchte ein kleines Netzwerk von Community-Seiten zu miteinander verwandten Themen einrichten. Anstatt aber alle Seiten einzeln zu bewerben, möchte man das ganze Netzwerk anpreisen und dem Benutzer als Paket anbieten. Natürlich muss man dann auch dafür sorgen, dass ein Benutzer sich bei seiner Registrierung nicht für alle Seiten des Netzwerks einzeln anmelden muss.

Es muss also eine gemeinsame Nutzertabelle her. Ein Benutzer, der sich auf einer Seite registriert, muss sich mit diesem Zugang auch automatisch in die anderen Seiten einloggen können. Natürlich sollen alle Seiten weiter eigenständige Datenbanken haben, nur die Benutzertabelle soll seitenübergreifend "geteilt" werden.

Klingt kompliziert, ist aber eigentlich ganz einfach. Wie ich im Grundlagen-Artikel erklärt hab, muss man bei der Installation der Multisite-Codebase, ja für jede Seite einen Unterordner im "sites" Ordner anlegen. Jede dieser Seiten bekommt ja durch das Installationsskript auch zwangsläufig eigene Datenbanktabellen. Hat man es auf eine gemeinsame Benutzertabelle abgesehen, sollte man nur eine MySQL Datenbank nutzen und die Tabellen der einzelnen Seiten durch Präfixe voneinander unterscheiden. Bei einer Installation der zwei Seiten:

  • allvintage.net
  • martinfrericks.de

würde ich dann also eine einzige Datenbank anlegen (z.B.: MeineDatenbank) und dann installiere ich die Tabellen beider Seiten in diese Datenbank. Ich gebe Ihnen lediglich verschiedene Präfixe, damit diese sich nicht gegenseitig überschreiben (z.B. "av_" für allvintage.net und "mf_" für martinfrericks.de. Am Ende sind dann in der Datenbank z.B. folgende Tabellen:

  • av_access
  • av_actions
  • ...
  • av_user
  • ...
  • mf_access
  • mf_actions
  • ...
  • mf_users
  • ...

In der settings.php im Ordner sites/allvintage.net/ steht jetzt dass der Tabellen-Präfix "av_" ist, und in der settings.php im Ordner sites/martinfrericks.de/ steht, dass der Präfix "mf_" ist.

Das Tolle ist, dass man der Variable $db_prefix nicht nur einen einfachen String zuweisen kann, wie hier

$db_prefix = 'av_';

sondern ein ganzes Array, wie hier

$db_prefix = array(
'default' => 'av_',
'users' => 'mf_',
'sessions' => 'mf_',
'authmap' => 'mf_',
'sequences' => 'mf_',
'role' => 'mf_',
'user_roles' => 'mf_',
'profile_fields' => 'mf_',
'profile_values' => 'mf_',
);

Wenn ich das in der settings.php von allvintage.net so schreibe, passiert folgendes:

Die Seite verwendet standardmäßig den Präfix "av_", aber für die speziellen Tabellen

  • users, sessions, authmap, sequences (Minimum für User sharing)
  • role, user_roles (wenn man die gleichen Benutzerrollen und deren Zuordnungen teilen will)
  • profile_fields, profile_values (wenn man das Profil-Modul verwendet und diese Angaben teilen will)

wird der Präfix "mf_" verwendet.

Wenn jetzt in der settings.php von martinfrericks.de auch

$db_prefix = "mf_";

steht, dann schreiben und lesen beide Seiten jeweils in und aus ihren eigenen Datenbanken, aber beide Seite schreiben und lesen die Nutzerinformation in und aus der Datenbanktabelle von martinfrericks.de. Die gleichen Tabellen von allvintage.net existieren natürlich auch noch, werden aber nicht genutzt.

Auf diese Weise können natürlich auch andere Datenbanktabellen von unbegrenzt vielen Seiten gemeinsam genutzt werden. Einfach intelligentes Community plumbing :)

Kommentare

Hallo ! Danke für diese zielsichere Anleitung zum teilender Benutzertabelle auf mehreren Drupal sites. Ich glaube bei den Präfixen hat sich ein kleine Tippfehler eingschlichen $db_prefix = array( 'default' => 'av_', 'users' => 'mf_', 'sessions' => 'mf_', 'authmap' => 'main_', 'sequences' => 'main_', 'role' => 'mf_', 'user_roles' => 'mf_', 'profile_fields' => 'mf_', 'profile_values' => 'mf_', ); Müsste "main_" nicht auch durch "mf_" ersetzt werden?. Zumindest habe ich keine "main_"-Tabellen lg Peter

Danke für den Hinweis...