Перейти к публикации

Частичная интеграция IPB 3.x с DLE через модуль внешней авторизации IPB


Рекомендованные сообщения

Invision Power Board умеет авторизовываться на внешних базах. Поэтому если в основу положить установленный Datalife, то прикручивая к нему форум возможно сделать так, чтобы форум авторизовывался из базы DLE.

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

Недостатки (если считать их таковыми) - логиниться надо на обоих сайтах порознь и пользовательские данные (личные сообщения, профили и т.п.) не синхронизируются.

Если недостатки критичны - используйте платные полные интеграции, этот гайд о подключении только внешней авторизации для IPB.

  1. Устанавливаем IPB

    По-умолчанию IPB ставится в UTF-8 кодировке. Так и делаем, заранее подготавливая базу для работы с юникодом. Дальнейшие инструкции рассчитаны на то, что IPB установлен в UTF-8, а DLE на windows-1251. Для UTF-версий Datalife этот метод не тестировался.

  2. Настраиваем модуль внешней авторизации в IPB

    - В System -> Tools & Settings -> Log In Management включаем External Database
    - Там же нажимаем иконку Edit Details... и в Log In User Register URL вписываем адрес регистрации DLE (site.ru/index.php?do=register)
    - Сохраняем изменения и нажимаем иконку Configure Details.... Вносим правки:
    -- Хост, порт, название базы, имя юзера и пароль для коннекта к базе
    -- Remote Database Table Name = users
    -- Remote Database Table Prefix = ваш префикс для таблиц (например, dle_) с подчёркиванием
    -- Remote Database Username Field = name
    -- Remote Database Password Field = password
    -- Password Hashing Technique = MD5

  3. Редактируем файл IPB admin\sources\loginauth\external\auth.php

    Находим:
    $check_pass = $password;
    После добавляем строку:
    $password = iconv("UTF-8","cp1251",$password);

    Находим:
    $check_pass = md5($password);
    Меняем на:
    $check_pass = md5(md5($password));

    Находим:
    $remote_member = $RDB->buildAndFetch( array( 'select' => '*',
    Перед добавляем строку:
    $username1251 = iconv("UTF-8", "cp1251", $username);

    Находим:
    'where' => REMOTE_FIELD_NAME."='".$RDB->addSlashes($username)."' ".REMOTE_EXTRA_QUERY ) );
    Меняем на:
    'where' => REMOTE_FIELD_NAME."=_cp1251'".$RDB->addSlashes($username1251)."' ".REMOTE_EXTRA_QUERY ) );

    Находим:
    $this->member_data = $this->createLocalMember( array( 'members' => array( 'name' => $username, 'password' => $password, 'email' => $email_address ) ) );
    Меняем на:
    $this->member_data = $this->createLocalMember( array( 'members' => array( 'name' => $username, 'password' => $password, 'email' => $remote_member['email'] ) ) );

  4. Исправляем недочёты в IPB, редактируем файл admin\sources\classes\member\memberFunctions.php

    Находим:
    if( !preg_match( "/^[" . $check_against . "]+$/i", $_name ) )
    Меняем на:
    if( !preg_match( "/^[" . $check_against . "]+$/ui", $_name ) )

  5. Исправляем недочёты в IPB, редактируем файл admin\applications\core\modules_public\ajax\register.php

    Перекодируем файл в UTF-8

    Находим:
    $name = strtolower( trim( rawurldecode( $_POST['name'] ) ) );
    Меняем на:
    $name = mb_strtolower( trim( rawurldecode( $_POST['name'] ) ) );

Теперь авторизовываясь в IPB, форум сползает в DLE'шную базу, попробует выцепить оттуда пользователя и пароль. Если пользователь найден и пароль введён правильно, IPB создаёт копию этого пользователя в своей базе. После этого таблицы пользователей будут работать параллельно с точки зрения IPB. Т.е. если пользователь после первого логина в IPB, сменит пароль в DLE, он сможет авторизовываться в IPB под любым из двух паролей.

Для любопытствующих, поясню зачем столько правок - причина в различных кодировках баз и страниц. Например, хэш слова "пароль" будучи представленным в UTF8 будет отличаться от того же слова "пароль" в windows-1251. Поэтому делается iconv(). По этой же причине мы вынуждены врезаться в файлы IPB исправляя strlen на mb_strlen (multibyte-функция) и добавляя флаг /u в функцию preg_match, которая по-умолчанию не умеет работать с unicode.

Ссылка на сообщение
Поделиться на других сайтах
  • 3 месяца спустя...
  • 2 месяца спустя...

Если человек поменят скажем логин

Насколько я понимаю, логин ведь пользователь менять не может, для него это не доступно.

или пароль

Он везде поменяется? или как?

если пользователь после первого логина в IPB, сменит пароль в DLE, он сможет авторизовываться в IPB под любым из двух паролей.
Ссылка на сообщение
Поделиться на других сайтах
  • 4 месяца спустя...

Подключил форум к UTF-версий Datalife. Использовал 1 и 2 шаг без изменений. Из третьего шага использовал только

$check_pass = md5(md5($password));  и $this->member_data = $this->createLocalMember( array( 'members' => array( 'name' => $username, 'password' => $password, 'email' => $remote_member['email'] ) ) );[/CODE]

При логинах на английском - проблем нет, все работает как часы.

При логинах на русском - затык. Не хочет авторизовываться :(

Изменено пользователем MiXa
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...