Instalación Multisitios compartiendo usuarios

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
karimbolivia's picture

Es sabido que en Drupal, podemos, a partir de una sola instalación (un solo código base de Drupal), tener varios sitios o subdominios compartiendo este mismo código pero teniendo cada uno sus propios módulos, themes y su base de datos.

Gracias a Gustavo (http://groups.drupal.org/node/23583) ya sabemos cómo hacerlo.

Ahora viene la necesidad de compartir usuarios entre estos distintos sitios o subdominios. Es decir que un usuario, una vez registrado en cualquier sitio, puede acceder a cualquier de los sitios de la instalación.

Imaginamos que tengamos los sitios example1.com y example2.com con una sola instalación de Drupal.

Encontré dos soluciones, una clásica y un poco documentada, las cuales pongo a su consideración y sobre todo apreciación.

1. La forma clásica: todos los sitios comparten la misma base de datos

Para example1.com tenemos en settings.php

// en  /sites/example1.com/settings.php
$db_url = 'mysqli://user1:contrasena@localhost/base_de_datos';
$db_prefix = array(
  'default'   => 'example1_',
  'users'     => 'shared_',
  'sessions'  => 'shared_',
  'role'      => 'shared_',
  'authmap'   => 'shared_',
);

Y para example2.com en settings tenemos
// from /sites/example2.com/settings.php
$db_url = ' mysqli://user1:contrasena@localhost/base_de_datos';
$db_prefix = array(
  'default'   => 'example2_',
  'users'     => 'shared_',
  'sessions'  => 'shared_',
  'role'      => 'shared_',
  'authmap'   => 'shared_',
);

Como lo vemos, los dos sitios comparten en realidad la misma base de datos (base_de_datos). Gracias a la variable $db_prefix podemos compartir las tablas de usuarios con el prefijo shared_, y el resto de las tablas por defecto no serán compartidas porque tienen prefijos distintos para cada sitio (example1_ y example2_).

Así tendremos en una sola base de datos las tablas que los dos sitios comparten con el prefijo shared_ y las tablas que No comparten con los prefijos exanmple1_ y example2_

2. Cada sitio tiene su propio base de datos y comparten una base de datos de usuarios

Creamos tres bases de datos

base_de_datos_1 que contiene todas las tablas que example1.com no comparten (con el user user1 y contrasena1).

base_de_datos_2 que contiene todas las tablas que example2.com no comparten (con el user user2 y contrasena2).

base_de_datos_usuarios que contiene las tablas compartidas de los usuarios de example1.com y example2.com. Esta base de datos tiene dos usuarios user1 y user2.

Para example1.com tenemos en settings.php

// en  /sites/example1.com/settings.php
$db_url = 'mysqli://user1:contrasena1@localhost/base_de_datos_1';
$db_prefix = array(
  'default'   => '',
  'users'     => 'base_de_datos_usuarios.shared_',
  'sessions'  => 'base_de_datos_usuarios.shared_',
  'role'      => 'base_de_datos_usuarios.shared_',
  'authmap'   => 'base_de_datos_usuarios.shared_',
);

Para example2.com tenemos en settings.php
// en  /sites/example2.com/settings.php
$db_url = 'mysqli://user2:contrasena2@localhost/base_de_datos_2';
$db_prefix = array(
  'default'   => '',
  'users'     => 'base_de_datos_usuarios.shared_',
  'sessions'  => 'base_de_datos_usuarios.shared_',
  'role'      => 'base_de_datos_usuarios.shared_',
  'authmap'   => 'base_de_datos_usuarios.shared_',
);

Vemos entonces que toda la información de los users será guardada en la BD base_de_datos_usuarios y que el resto de la información será guardada en base_de_datos_1 para example1.com y en base_de_datos_2 para example2.com

Personalmente me gusta más la solución 2 por su claridad. Cada sitio tiene su propia BD y todos comparten los usuarios en una base de datos externa: base_de_datos_usuarios

Una vez más nos damos cuenta de la enorme flexibilidad de Drupal.

La pregunta es: cual de las dos soluciones tiene su preferencia?

Saludos

Comments

me tira error.

brujo321's picture

buenas. intente la opción numero 1 pero no consigo que funcione. tengo un sitio ya funcionando en drupal lo que quise intentar fue armar un segundo sitio como network.localhost. la carpeta esta bien puesta. pero al momento de instalar me tira error porque ya existe la tablas shared_ .

hay alguna solución?