Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2011-01-02 17:58:49

Luca
Участник
Зарегистрирован: 2009-10-08
Сообщений: 164

Нужно реализовать одну штуку

Нужно реализовать следующее:
1. Перенести 1 раздел форума на другой форум
1.1. Перенести всю базу пользователей и сделать интегрированную регистрацию. Пользователь зарегистрированный на форуме1 должен автоматически становиться зарегистрирован и авторизован на форуме 2.
2. Перенести один раздел форума1 на форум2 и закрыть раздел на форуме1, сделав так что при обращении к нему пользователь перебрасывается на форум2.

Объясняю зачем нужен пункт 2. Допустим у меня есть форум о растениеводстве. Одна из веток форума называется "все о морковке". Я хочу сделать отдельный форум посвященный морковке, но я понимаю, что пользователи просто так не пойдут на общаться на пустой форум о морковке.

Для этого нужно перенести сообщения и пользователей со старого форума на новый. Сделать удобную кросс-регистрацию. В идеале транслировать заголовки разделов форума2 в оригинальный раздел форума1, так чтобы пользователи растеневоды видели, что в разделе о морковке идет обсуждение.

Кто возьмется готов заплатить за работу. Много не обещаю, но все таки...

Offline

#2 2011-01-06 08:52:19

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужно реализовать одну штуку

Легче всего общих пользователей реализовать, когда оба форума лежат в одной базе.

Форумы имеют разные префиксы таблиц.
Таблица юзеров в одном экземпляре и у нее префикс установлен в base.
В коде форума меняем подстроку '.$db->prefix.'users на base_users.
Файлы конфигов у обоих форумов одинаковые, различаются переменной $db_prefix.

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

Offline

#3 2011-01-06 09:38:50

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Нужно реализовать одну штуку

Объединение двух таблиц пользователей это очень непросто.
Когда я перетаскивал сюда темы v1.2 с форума PunBB я был вынужден сделать так: объявил все переносимые сообщения как бы от имени Гостя. Имена есть, но они не ссылаются на пользовательский профиль.

P.S. Хотя, если БЫ эти два форума были на одной платформе и шифрация паролей была бы одинаковой, я бы наверное попотел и перетащил пользователей. Делать для других не буду, трудоемко и неинтересно.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#4 2011-01-06 11:53:17

Luca
Участник
Зарегистрирован: 2009-10-08
Сообщений: 164

Re: Нужно реализовать одну штуку

м... неужели это так сложно реализовать? Может я себе это плохо представляю. Но мне это видится так:
пользователь регистрируется на форуме 1, идет запрос на форум 2, там тоже создается такой же пользователь, далее "нужно дописывать отправку данных методом POST на другой форум, чтобы куки прописались от него на компе юзера."
Мы же можем создать пользователя сразу в двух базах имея одинаковую версию форума и тут и там? Главная проблема то в чем? Можно попонятнее объяснить?

Offline

#5 2011-01-06 12:09:46

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужно реализовать одну штуку

Luca, проблемы:
1. Синхронизация порядковых номеров пользователей при наличии двух таблиц users в разных базах.
2. Синхронизация данных каждого пользователя в обоих базах.
Т.е. если ты имеешь две раздельные базы, нужно к каждому запросу меняющему данные в таблице users добавлять второй запрос на изменения данных во второй базе.
Регистрация через POST-запрос на другой форум не пойдет, так как может быть нарушена синхронизация порядковых номеров пользователей.

artoodetoo, это у тебя POST запрос организован?

    private function _httpPost($host, $path, $data, $port = 80)
    {

        $req = $this->_qsencode ($data);

        $http_request  = "POST {$path} HTTP/1.0\r\n";
        $http_request .= "Host: {$host}\r\n";
        $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
        $http_request .= "Content-Length: " . strlen($req) . "\r\n";
        $http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
        $http_request .= "\r\n";
        $http_request .= $req;

        $response = '';
        if (false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) )) {
            die ('Could not open socket');
        }

        fwrite($fs, $http_request);

        while (!feof($fs)) {
            $response .= fgets($fs, 1160); // One TCP-IP packet
        }
        fclose($fs);
        $response = explode("\r\n\r\n", $response, 2);

        return $response;
    }

З.Ы. По аналогии можно логирование на двух форумах сделать.

Offline

#6 2011-01-06 12:11:52

Luca
Участник
Зарегистрирован: 2009-10-08
Сообщений: 164

Re: Нужно реализовать одну штуку

Visman,
Так, а если базу пользователей одну оставить? т.е. 2 форума, в разных базах, но второй использует базу пользователей от первого форума? Это упрощает задачу?

Offline

#7 2011-01-06 12:28:08

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужно реализовать одну штуку

Luca, нет, т.к. как ПХП будет обращаться одновременно к двум базам? Это нереально.
Одна база для двух форумов с одной таблицей users,
либо переписывать код форума на синхронное изменение данных в таблицах users в двух базах, например, добавить модуль, который будет принимать строку запроса с другого форума, проверять ее подлинность (чтобы со стороны что не заслали) и выполнять этот запрос в базе своего форума. Т.е. вроде API.

Offline

#8 2011-01-06 12:42:25

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Нужно реализовать одну штуку

Чтобы авторизовать пользователя другого ресурса не надо изобретать велосипед. Нужен OpenID на одном, а лучше на обоих форумах. Но это отдельная тема...


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#9 2011-01-07 14:33:46

Амиго
Участник
Зарегистрирован: 2011-01-07
Сообщений: 5

Re: Нужно реализовать одну штуку

Visman пишет:

Luca, нет, т.к. как ПХП будет обращаться одновременно к двум базам? Это нереально.

Уважаемый, php прекрасно работает одновременно с неограниченным количеством баз данных, даже разнотипных.

Visman пишет:

Одна база для двух форумов с одной таблицей users,
либо переписывать код форума на синхронное изменение данных в таблицах users в двух базах, например, добавить модуль, который будет принимать строку запроса с другого форума, проверять ее подлинность (чтобы со стороны что не заслали) и выполнять этот запрос в базе своего форума.

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

Offline

#10 2011-01-07 14:50:57

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Нужно реализовать одну штуку

Амиго, ты имел в виду скрипт авторизации, а не регистрации?

Допустим я захожу на форум Б, где меня до сих пор не было и ввожу правильные имя и пароль от форума А. Что дальше?

Задачка 2. Что если на двух форумах есть два пользователя с одинаковыми именами и разными email? Это один человек?


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#11 2011-01-07 14:56:16

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Нужно реализовать одну штуку

Нормальное решение может быть таким, оно работает на множестве сайтов: есть сервер авторизации, который используют один или несколько поставщиков услуг. Поставщик услуг (форум) доверяет серверу авторизации, сам не пытается авторизовать.
Если возвращен положительный статус, поставщик услуг смотрит заведен ли уже на этот внешний id профиль здесь, если надо - создает профиль "на лету".


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#12 2011-01-07 15:03:15

Амиго
Участник
Зарегистрирован: 2011-01-07
Сообщений: 5

Re: Нужно реализовать одну штуку

artoodetoo, я имел в виду именно скрипт регистрации. smile
Ответ на задачу 1. Пусть форумы используют один и тот же движок, тогда средства проверки валидности логина и пароля у них одинаковы. В скрипте авторизации проверяем наличие логина в БД форума 1. В случае наличия получаем хэш пароля из бд 1, в случае отсутствия получаем хэш из БД 2. Если пользователя с логином, который введён, нет ни в одной базе, в регистрации отказываем.
Пусть форумы используют разные движки. Тогда в каждый из скриптов авторизации копируем механизм работы другого скрипта авторизации, тупо копипастим кусок кода.
В случае наличия пользователя с заданным логином в основной базе, используем основной метод проверки валидности пароля, в случае наличия пользователя во второй базе, используем метод проверки пароля форума2.

Ответ на задачу 2. Зависит от настроек, этот момент нужно уточнить у Luca.

Offline

#13 2011-01-07 16:44:24

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Нужно реализовать одну штуку

Видишь ли, все это обсуждалось уже не раз, я сам пытался на практике сделать подобный симбиоз, поэтому оставлю тебе возможность самому набить шишки и прийти к тем же выводам )))

А вообще топикстартер задал вопрос о переносе данных, а не о единой авторизации. Мы немного съехали в сторону, хотя вопросы близкие.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#14 2011-01-07 16:51:35

аrtoodetoo
Гость

Re: Нужно реализовать одну штуку

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

#15 2011-01-07 16:57:44

Амиго
Участник
Зарегистрирован: 2011-01-07
Сообщений: 5

Re: Нужно реализовать одну штуку

artoodetoo, топикстартер в 1.1 хочет сделать единую регистрацию и единую авторизацию. Это возможно, хотя и несколько нудно.
Перенос данных между форумами на одном движке заключается всего лишь в копировании БД.

Если, повторюсь ещё раз, форумы используют один и тот же движок, задача тривиальна. smile

Offline

#16 2011-01-07 17:05:51

Амиго
Участник
Зарегистрирован: 2011-01-07
Сообщений: 5

Re: Нужно реализовать одну штуку

$dbh1 = mysql_connect(); mysql_select_db("db1",$dbh1);
$dbh2 = mysql_connect(); mysql_select_db("db2",$dbh2);

$login;
$password;

$hash = mysql_query("SELECT `hash`  FROM `users` WHERE `login`='$login' LIMIT 1",$dbh1);
if (mysql_num_rows($hash)<1)
    $hash = mysql_query("SELECT `hash`  FROM `users` WHERE `login`='$login' LIMIT 1",$dbh2);
if (mysql_num_rows($hash)<1)
    die();

$hash = mysql_fetch_row($hash);
$hash = $hash[0];


if (authorize($login,$password,$hash))
    // авторизировать
else 
    die();

Тащем-та, как-то так.

Редактировался Амиго (2011-01-07 17:42:31)

Offline

#17 2011-01-07 22:17:04

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Нужно реализовать одну штуку

Люблю людей у которых всё просто. Надеюь топикстартер будет доволен. Купил попкорн и колу, жду продолжения.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#18 2011-01-07 23:14:35

Амиго
Участник
Зарегистрирован: 2011-01-07
Сообщений: 5

Re: Нужно реализовать одну штуку

artoodetoo пишет:

Люблю людей у которых всё просто. Надеюь топикстартер будет доволен. Купил попкорн и колу, жду продолжения.

Прошу высказать критические замечания.  smile

Offline

#19 2011-01-08 10:58:43

scalemaster
Участник
Зарегистрирован: 2009-08-10
Сообщений: 134

Re: Нужно реализовать одну штуку

Luca, бюджет объявите, я могу такое сделать, но очень ленив.
В смысле, могу перетащить юзеров и их хозяйство (посты, темы) в другую базу. Больше ничего не понял из ТЗ.

Редактировался scalemaster (2011-01-08 11:02:38)

Offline

#20 2011-01-08 20:52:25

Luca
Участник
Зарегистрирован: 2009-10-08
Сообщений: 164

Re: Нужно реализовать одну штуку

scalemaster, да перетащить посты и темы я и сам могу, но дело в оставшейся части ТЗ. Если мне люди не помогут, то буду тут искать тех, кто за $ сможет решить проблему.

Offline

#21 2011-01-09 11:16:22

scalemaster
Участник
Зарегистрирован: 2009-08-10
Сообщений: 134

Re: Нужно реализовать одну штуку

Luca, насколько понял я, вторая часть заключается в переадресации? RewriteRule насочинять, не думаю, что очень много потребуется строк. Либо просто редирект в новый раздел.

Offline

#22 2011-01-09 11:50:13

Luca
Участник
Зарегистрирован: 2009-10-08
Сообщений: 164

Re: Нужно реализовать одну штуку

scalemaster,
вторая часть задания заключается в избавление пользователя от необходимости двойной регистрации на проекте А и Б
т.е. зарегился на проекте А и не нужно региться на проекте Б. и наоборот.

Offline

#23 2011-01-09 13:23:54

scalemaster
Участник
Зарегистрирован: 2009-08-10
Сообщений: 134

Re: Нужно реализовать одну штуку

Luca, так оно в первой части реализуется. Переносятся пользователи, профили, сообщения. Или я опять не так понял?

Offline

#24 2011-01-09 19:27:02

Luca
Участник
Зарегистрирован: 2009-10-08
Сообщений: 164

Re: Нужно реализовать одну штуку

scalemaster,
"т.е. зарегился на проекте А и не нужно региться на проекте Б. и наоборот."
задача чтобы новым пользователям не потребовалась повторная регистрация.

Offline

#25 2011-01-09 21:47:13

scalemaster
Участник
Зарегистрирован: 2009-08-10
Сообщений: 134

Re: Нужно реализовать одну штуку

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

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens