Сквозная авторизация и единая база пользователей для 1.10.3

+64
5.45K

Цель:

1. Единая база пользователей для нескольких сайтов (все сайты используют одну базу данных, префиксы разные)
2. Авторизовавшись на одном сайте, нужно быть автоматически авторизованным на всех остальных.
3. Отправив сообщение пользователю на первом сайте, дать ему возможность прочитать его на любом другом

Иллюстрация

Решение

1. хак файла \core\classes\db.class.php. -> Единая база пользователей
Для этого не обязательно, чтобы сайты были поддоменами — важна лишь единая база данных

2. хак файла \core\cms.php -> Единые куки для всех сайтов.
А вот для этого сайты обязательно должны быть поддоменами одного домена + сам основной домен.

Код

1. db.class.php
Добавить в блок объявлений переменных строку
  1. public $users_prefix = 'my';
где "my" — это ваш префикс таблиц, в которых хранятся пользователи. Например, префикс БД для основного домена.

в метод
  1. public function query($sql, $ignore_errors=false, $replace_prefix = true){
добавить после
  1. $sql = $replace_prefix ? $this->replacePrefix($sql) : $sql;
строки
  1.  
  2. $prefix = cmsConfig::getConfig('db_prefix');
  3. if ($this->users_prefix !== $prefix) {
  4. $sql = trim(str_replace($prefix.'_user',$this->users_prefix.'_user',$sql));
  5. }
  6.  
После этого все сайты будут обращаться к единой базе пользователей.

2. cms.php
в блок объявления переменных добавить строку
  1.  
  2. private static $maindomain = '.site.ru';
  3.  
где site.ru — это ваш основной домен. Это нужно для единых кукисов.

заменить метод
  1.  
  2. public static function setCookie($name, $value, $time){
  3. setcookie('InstantCMS['.$name.']', $value, $time, '/', null, false, true);
  4. }
  5.  
на
  1.  
  2. public static function setCookie($name, $value, $time){
  3. setcookie('InstantCMS['.$name.']', $value, $time, '/', self::$maindomain, false, true);
  4. }
  5.  
заменить
  1.  
  2. public static function unsetCookie($name){
  3. setcookie('InstantCMS['.$name.']', '', time()-3600, '/');
  4. }
  5.  
на
  1.  
  2. public static function unsetCookie($name){
  3. setcookie('InstantCMS['.$name.']', '', time()-3600, '/',self::$maindomain);
  4. }
  5.  

Файлы для 1.10.3

скачать
Перед заменой — обязательно сделать копии своих файлов. Для других версий инстанта можно руками поменять код в файлах.

Пример:

1. izhevsk.pechenuka.ru/
2. sochy.pechenuka.ru/
3. moscow.pechenuka.ru/

Как проверить — зайти на любой сайт, авторизоваться под user1 123123 (либо зарегать нового юзера — проще всего это сделать на первом домене). Потом зайти на второй сайт уже авторизованным.
Выход из аккаунта работает после перезагрузки браузера — удаление сессий со всех сайтов не делал. То есть выходим с любого сайта, закрываем/открываем браузер и проверяем.
0
Def Def 11 лет назад #
отличный хак!!! будет очень полезно
+3
Endroid Endroid 11 лет назад #
Хорошее решение! Движемся в сторону настоящего мультисайтинга?
+2
BELIEVER BELIEVER 11 лет назад #
Как всегда полезности от SJen
+1
MauND MauND 11 лет назад #
Мне кажется или нужна такая вшитая фунцкия в сам движок:)
Например так как при создание англоязычной версии контент должен размещаться разные:)Следовательно базы думаю должны быть разные:)
0
SJen SJen 11 лет назад #
разный контент - это не значит разные базы. Общая только база пользователей, все остальное у каждого подсайта уникальное - блоги, клубы, статьи.. Может быть на одном языке, может быть на разных.
0
Су-27 Су-27 11 лет назад #
Спасибо - хорошее дополнение. При использовании одной базы для нескольких сайтов как сильно увеличится нагрузка на базу мускула и как вы решили проблему с синхронизацией крона, если все сайты находятся на разных серверах и в разных часовых поясах?
+2
stealthdebuger stealthdebuger 11 лет назад #
Радует энтузиазм, восприимчивость к критике и желание совершенствоваться.
Считаю, что именно с таким подходом можно поднять привлекательность InstantCMS среди простых обывателей.
Спасибо за ваш труд.
0
SJen SJen 11 лет назад #
При использовании одной базы для нескольких сайтов как сильно увеличится нагрузка на базу мускула
Нагрузка на сервер останется такой же. А как вы мониторите нагрузку на конкретную базу данных?
0
Су-27 Су-27 11 лет назад #
Можно через Zabbix или через Mtop - это то что я пробовал а так утилит в сети хватает...
+2
SJen SJen 11 лет назад #
как вы решили проблему с синхронизацией крона, если все сайты находятся на разных серверах и в разных часовых поясах?
Если физически база пользователей у каждого сайта своя и нужно их синхронизировать - то это совсем другая задача. Не говорю, что это нереально - реально, конечно. Просто я такой задачи перед собой не ставил. Только вот сквозной авторизации в таком случае будет непросто добиться.
-1
tokarev tokarev 11 лет назад #
у deltas всегда любой "сделай сам" написан понятным языком))) аццкий плюс!
0
tokarev tokarev 11 лет назад #
Сорри не туда...
+5
SJen SJen 11 лет назад #
забавно, не правда ли? - написали не туда, а свою порцию плюсов получили rofl
0
lokanaft lokanaft 11 лет назад #
Мало того, теперь для них автор сего не вы, а deltas)
0
Князь Мышкин Князь Мышкин 11 лет назад #
Как бы хорошо было, если бы сквозная авторизация была уже из коробки, а ...
0
alexbabo alexbabo 11 лет назад #
1 и 2 это два разных метода или надо оба файла править?
Подробнее можно инструкцию?
+1
SJen SJen 11 лет назад #
Подробная инструкция:

Вариант 1 (для 1.10.3). Скачать файлы и заменить у себя. Все.
Вариант 2 (для <1.10.3). Внести по порядку все изменения, прописанные в топике. Все.

Там две цели -
1. Единая база пользователей (правим db.class.php)
2. Сквозная авторизация (правим cms.php)

Если надо и то и другое - правим/заменяем оба файла. Если надо что-то одно - правим один файл.
0
alexbabo alexbabo 11 лет назад #
Спасибо SJen за пояснения.Так как я не очень разбираюсь в этом вопросе и чтобы не экспериментировать,появилось ещё пару вопросов.
В 1 и 2 случае надо файлы заменить на всех сайтах?Или только поддоменах или только на главном сайте?
И не надо вносить изменения в базу данных?Добавлять новую таблицу пользователей?

Для самопознания:
Интересно для дилетанта,я нигде не заметил обращения к определённой базе,как же распознает чужой сайт, к какой базе с нужной таблицей пользователей, подключиться?
С общей базой понятно,пользователь имеет свой профиль на каждом сайте и имеет все права.А при сквозной авторизации пользователь ,попавший с другого сайта,лимитирован в действиях?Оставив комментарий или написав пост, статью-в какой базе этот материал хранится и и кликнув по никнейму автора поста,переход будет в профиль на родной сайт пользователя?
+1
SJen SJen 11 лет назад #
Постараюсь подробно расписать
В 1 и 2 случае надо файлы заменить на всех сайтах?Или только поддоменах или только на главном сайте?
На всех сайтах, где это должно работать. Главная + поддомены, или только поддомены, или часть поддоменов - зависит от целей.

И не надо вносить изменения в базу данных? Добавлять новую таблицу пользователей?
База пользователей у вас уже есть, нужно лишь указать префикс к этой базе (public $users_prefix = 'my';). Никаких изменений дополнительно вносить не нужно. Только заменить файлы.

Интересно для дилетанта,я нигде не заметил обращения к определённой базе,как же распознает чужой сайт, к какой базе с нужной таблицей пользователей, подключиться?
База данных у всех сайтов одна, например, mybase. А вот префиксы таблиц разные. Нужно указать лишь префикс таблиц с единой базой пользователей.(public $users_prefix = 'my';). Зная этот префикс, все сайты будут использовать пользователей именно из таблиц с этим префиксом.

А при сквозной авторизации пользователь, попавший с другого сайта, лимитирован в действиях?
Не совсем понял вопрос, в чем именно лимитирован? - если пользователь в группе "Админы" - то он везде админ, если в группе "Редакторы" - то везде редактор. База юзеров единая, настройки единые.

Оставив комментарий или написав пост, статью-в какой базе этот материал хранится
Оставив коммент к статье на сайте 1, увидеть коммент можно только на сайте 1. База комментов то не единая, контент хранится на каждом сайте отдельно, в таблицах со своим префиксом.

кликнув по никнейму автора поста,переход будет в профиль на родной сайт пользователя?
У пользователя нет родного сайта, они все для него родные. Профиль будет открываться на конкретном сайте - и профиль может везде открываться по разному. В разном дизайне, с различным количеством информации.
0
alexbabo alexbabo 11 лет назад #
Теперь понятно,значит у каждого сайта нету отдельной базы,а одна общая.То есть при установке новой цмс,надо указывать ту же базу что и у другого сайта,но надо будет сменить префикс при инсталляции?А возможно смежить разные базы ,уже существующих сайтов, в одну базу для этих целей?Я не пробовал такого.
+1
SJen SJen 11 лет назад #
Теперь понятно,значит у каждого сайта нету отдельной базы,а одна общая.
Все верно, база одна. Это обязательное условие.

То есть при установке новой цмс,надо указывать ту же базу что и у другого сайта,но надо будет сменить префикс при инсталляции?
Точно, базу ту же. А префикс уникальный.

А возможно смежить разные базы ,уже существующих сайтов, в одну базу для этих целей?
Можно все, но непросто - точнее много надо будет исправлять в БД.
1. перенумеровывать пользователей во всех базах кроме основной (перед тем, как слить их в одну базу).
2. соответственно вносить изменения в таблицу блогов, клубов, комментов и других компонентов, в которых есть ссылка на пользователей.

Проще, конечно, изначально все делать в одной базе - вот разделить их потом (при необходимости) не проблема. А слить в одну пользователей из разных баз непросто.
0
alexbabo alexbabo 11 лет назад #
Спасибо за подробную информацию v
0
Michail Michail 11 лет назад #
А как будут обстоять дела с автарами пользователей? Если пользователь зарегистрировался на основном сайте или поддомене? Или в данном случае пользователь может зарегистрировать только на основном сайте?
0
SJen SJen 11 лет назад #
если ничего не делать, то отображаться аватар будет на том сайте, на котором его загрузили.. Тут надо подумать как лучще - может быть хранить в базе не локальный путь к аватару (/images/users/avatars/small/7697****.jpg), а путь с указанием домена и тогда не важно где он будет загружен
0
Endroid Endroid 11 лет назад #
Точно. В идеале вообще все картинки на отдельный поддомен грузить. И на всех сайтах будут, и, говорят, производительность лучше )
0
Шадринец Шадринец 11 лет назад #
Я немного не понял с
Код PHP:
  1. private static $maindomain = '.site.ru';
где site.ru это мой основной домен пишется на всех поддоменнах только основной или с поддоменнами тоесть точька перед .site.ru для этого и что прописываетса на основном?
0
SJen SJen 11 лет назад #
смысл в том, что поддомены видят куки установленные для главного домена - то есть указывать надо главный домен. Даже если на нем самом вы не хотите делать сквозную авторизацию.
0
webscs webscs 10 лет назад #
Приветствую всех.

У меня вот такой вопрос: "цель: Городской порта на поддоменах, news.domen.ru, board.domen.ru и т.д. единую авторизацию на под доменах рулим хаком, а обязательно ли префиксы делать разные? ведь все что относится к новостям будет выводиться только на news.domain.ru, модуль объявления - только на board.domain.ru"

Я где то читал, что такое лучше делать изменением в настройках под доменов на серваке в аппаче. Так как будет оптимальнее?
0
maia maia 10 лет назад #
А это реально сделать, если один сайт на 1.9, а другой на 1.10.3?
0
Greko Greko 10 лет назад #
Все далаю как написано, но после замены файла для единой базы пользователей, при открытии любой страницы, нет ничего, пустая страница. В чем может быть проблема?
0
Greko Greko 10 лет назад #
Затупил. С пустой страницей. А вот сделать все корректно не получаеться. Все делаю как написано но базы не клеяться. при установке нового двига в базу ложиться cms.users_users

Все делаю пошагово и ничего не происходит. Или это действует только на одинаковых версиях инстанта? У меня ода 1.10.1 а вторая 1.10.3
0
Greko Greko 10 лет назад #
Уже и переименовывал префиксы и что только не делал, не подключается к одной базе пользователей и все. Не могу понять что я делаю не так...
0
Greko Greko 10 лет назад #
А изменения в файле db.class.php приводят к пустой странице...
0
Greko Greko 10 лет назад #
Все получилось!!! Огромное спасибо!!! В том что не мог разобраться моя вина! Еще раз огромное человеческое СПАСИБО!!!
0
Евгений Евгений 10 лет назад #
Подскажите, пожалуйста, как сделать общее разлогинивание.
0
Intrerio Intrerio 10 лет назад #
Пару месяцев назад пробовал проделать процедуру соединения папок с картинками. Сделал лишь так что б фото независимо от сайта загрузки отображались на всех сайтах, но сами аватары так и не смог сделать. Может кто-то уже реализовал?
0
Capitan Capitan 10 лет назад #
ну не получается и все!
1. копирую файлы в поддомен
2. прописываю префикс ОСНОВНОЙ БД
3. прописываю основной домен
и ничего не меняется
0
Intrerio Intrerio 10 лет назад #
Я так понимаю что тема заглохла... А все ж интересно было бы сделать сайт на котором много поддоменов со своими сайтами но модули, компоненты и даже шаблоны едины для всех и админ просто выбирает то что он хочет видеть на сайта со списка. На вордпресе реализована подобная возможность
0
Шадринец Шадринец 10 лет назад #
Я тоже присоединяюсь к теме Может будет продолжение,Как написано все поставил, работает авторизация и регистрация,хотелось бы обобщить аватарки личные фото .
0
Nikit Nikit 10 лет назад #
Спасибо. Сейчас думаю над этой проблемой. А здесь почти готовое решение.
0
Александр Александр 9 лет назад #
Есть кто живой кто проделывал процедуру? может сталкивались с таким моментом, версия 1.10.4 (вероятно неважно какая версия движка), проделал на домене и поддомене, в результате если авторизуешься на домене, то поддомен куки видит и ты там тоже авторизован, если сначала на поддомене авторизуешься, то домен этого не видит, в остальном все работает.

и кстати в примере только 1 и 3 ссылка куки воспринимает.
0
Александр Александр 9 лет назад #
И то это работает только в последнем IE , в других браузерах не передаются куки, видимо произошло глобальное какоето изменение в правилах безопасности браузеров или как то так...
0
broman broman 9 лет назад #
а на instantcms 2.1.2 будет работать?
0
broman broman 9 лет назад #
а на instantcms 2.1.2 будет работать?
+1
Ї Ђ&#227;&#238;&#311;&#8499;&#257;&#331; Ї Ї Ђãîķℳāŋ Ї 9 лет назад #
Лови +
0
sosed sosed 8 лет назад #
А для InstantCMS 2.x можете подобное объединение сделать?
0
DeusSpa DeusSpa 7 лет назад #
Всем доброго времени суток.
Если подобное решения для объединения базы пользователей?
И синхрона авторизации, с главный сайт на 2 ветке, поддомен на 1 ветке.

Еще от автора

Обновление компонента "Мне нравится"
Приветствую. Закончил версию с исправлением ошибок и багов, всем пользователям обновление выслано на электронку.
Обновление компонента  "Каталог дополнений в админку"
Приветствую. Обновление самого популярного аддона из официального каталога дополнений.
Обновленный парсер Яндекс.Карт
Приветствую Изменения довольно значительны, поэтому имеет смысл оформить их отдельным постом.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.