Общий вход на сайты, которые расположены на поддоменах (без использования дополнительных модулей)

Lullabot

При существовании большого количества модулей касающихся вопросов регистрации на сайте и входа в аккаунт, легко упустить из вида тот момент, что Друпал уже имеет встроенный механизм единого входа на разные сайты. Для этого не нужны дополнительные модули, не нужно их настраивать, нужно только поправить 20 строк в файле settings.php.

Это решение подойдёт в большинстве случаев, но установка необходимых параметров различается в зависимости от того, что нужно получить. Давайте определимся с тем, какие условия необходимо соблюсти, чтобы описанный в этой статье способ работал:

  • Сайты использующие общие аккаунты должны находится на одном домене. Например:
    • example.com
    • forums.example.com
    • subsite.example.com
  • Необходимо использовать базу данных MySQL
  • Сайты должны находится на одном сервере, чтобы иметь возможность обращаться к разным базам данных

Если ваши сайты удовлетворяют этим требованиям, то вы близки к созданию простого, эффективного и лёгкого общего входа на любой из них с использованием пользователем одного аккаунта.

Идея этого общего входа основана на возможности использования префиксов таблиц в базе данных. Как известно, для создания сайтов можно использовать одну базу данных и префиксы таблиц. Однако, большинство сайтов не используют одну и ту же базу данных, обычно для каждого сайта создают свою базу. Понимание Друпалом префиксов таблиц в этом случае может быть объединено с возможностью MySQL делать запросы к разным базам данных, что даст возможность использовать одну и ту же таблицу для разных сайтов. В этом случае вам потребуется добавить в куки-файл информацию о домене. Таким образом сайты смогут обмениваться информацией используя сессии пользователей.

Конфигурация мастер-сайта

На мастер-сайте (сайте, на котором хранится информация о пользователях) не потребуется делать сколь-либо сложных изменений. В любом файле settings.php хранится подобная запись:

$db_url = 'mysql://user:pass@localhost/master_database';
$db_prefix = '';

Эта запись определяет базу данных с которой работает сайт и в которой будет храниться общая для всех сайтов информация. Мастер-сайт будет хранить в этой базе все логины, пароли и сессии, которые будет сделаны общими для всех сайтов.

Нас будут интересовать строки, которые находятся несколько ниже этой записи и которые определяют домен в куки-файлах. Для наших целей необходимо раскомментировать (удалить знаки «#» в начале строк) следующую строку и определить в ней название домена:

$cookie_domain = '.example.com';

Конфигурация ведомого-сайта

Ведомый сайт должен подключаться к определённым таблицам базы данных основного сайта. В нашем случае это те таблицы, которые хранят информацию о пользователях. Это подключение позволит пользователям входить в свой аккаунт на ведомом сайте использую аккаунт мастер-сайта. Для этого нам придётся задействовать префиксы баз данных. На ведомом сайте необходимо определить базу данных, которая будет использоваться по умолчанию и базу данных, которая будет использоваться для определённых таблиц:

$db_url = 'mysql://user:pass@localhost/slave_database';
$db_prefix = array(
   'default'   => 'name_of_slave_database.',
   'users'     => 'name_of_master_database.',
   'sessions'  => 'name_of_master_database.',
   'role'      => 'name_of_master_database.',
   'authmap'   => 'name_of_master_database.',
);

После этого, нужно настроить домен, который будет использоваться в куки-файлах. Этот домен должен быть таким же, как и на мастер-сайте:

$cookie_domain = '.example.com';

При использовании описанного выше способа, пользователи смогут использовать одно и то же сочетание логина и пароля на мастер-сайте и на ведомом сайте. Вход в аккаунт на любом из таких сайтов, немедленно приведёт ко входу на все объединённые сайты. Пользователи смогут менять свои пароли и это так же будет работать на всех сайтах, а вы по-прежнему сможете использовать виды для создания списков пользователей на всех сайтах. Крикнем «Браво!» общим куки-файлам.

Идём дальше

Только из-за добавления нескольких строк кода в файлы settings.php на различных сайтах, вы можете сделать вход на эти сайты общим. Отметьте: делая общий вход, возможно будет удобным сделать общей и связанную с пользователями информацию. Например если вы используете стандартный модуль Profile, возможно вы захотите сделать общими таблицы profile_fields{} и profile_values{}.

Делая общими аккаунты на разных сайтах, вы можете столкнуться с тем, что адреса изображений пользователей имеют относительный формат и ссылаются на папку мастер-сайта. Для решения этой проблемы, вы можете на ведомом сайте символьную ссылку для папки files/pictures, которая будет указывать на папку files/pictures мастер-сайта.

ln -s /usr/home/example.com/sites/default/files/pictures /usr/home/subsite.example.com/sites/default/files/pictures

Ещё раз замечу, что этот подход работает только в случае поддоменов и когда сайты расположены на одном сервере. Встроенные в браузеры правила безопасности не позволяют сайтам читать куки-файлы сайтов расположенных на других доменах. Если для вас это невыполнимо, то вы можете прибегнуть к другим решениям, например таким как OpenID Provider, Single Sign-on или Bakery Single Sign-On System.

Эта статья была профинансирована нашими друзьями из Dooce! Вы можете увидеть описанное в статье решение в действии на их сайтах с объединёнными таблицами:

  • dooce.com
  • community.dooce.com