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

Тема в разделе "DLE", создана пользователем Darkmind, 24 окт 2011.

Информация :
Актуальная версия DataLife Engine 12.0
( Final Release v.12.0 | Скачать DataLife Engine | Скачать 12.0 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.3 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Статус темы:
Закрыта.
Модераторы: killoff
  1. Darkmind

    Darkmind SNMP maniac

    Регистр.:
    31 май 2006
    Сообщения:
    184
    Симпатии:
    76
    Делаю кросспост своего сообщения с официального форума - тема полезная, а на оф.форуме сидят не все. Мало ли кому пригодится.
    .
    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.
     
  2. palbanec

    palbanec

    Регистр.:
    2 июл 2010
    Сообщения:
    457
    Симпатии:
    40
    А для Dle utf8 переписать может кто?
     
  3. Darkmind

    Darkmind SNMP maniac

    Регистр.:
    31 май 2006
    Сообщения:
    184
    Симпатии:
    76
    Для UTF, скорее всего не надо принудительно ставить коллейшен в запросе и делать iconv. Не проверял, но предположительно исправления в третьем шаге будут:
    $check_pa
    1. ss = md5(md5($password));
    2. $this->member_data = $this->createLocalMember( array( 'members' => array( 'name' => $usern
    ame, 'password' => $password, 'email' => $remote_member['email'] ) ) );

    4 и 5 шаги, по идее, останутся теми же, т.к. это исправления в IPB, который хочет работать с ANSI, а не UTF входными данными.
     
    palbanec нравится это.
  4. Kaskada

    Kaskada Писатель

    Регистр.:
    24 окт 2011
    Сообщения:
    57
    Симпатии:
    1
    пардон.... вопрос снят...
     
  5. ReliZ

    ReliZ Постоялец

    Регистр.:
    3 сен 2011
    Сообщения:
    52
    Симпатии:
    1
    Насколько я понял пойдёт DLE 9.4 + IPB 3.2.3? И интеграция односторонняя?
     
  6. Darkmind

    Darkmind SNMP maniac

    Регистр.:
    31 май 2006
    Сообщения:
    184
    Симпатии:
    76
    Да, на данный момент у меня работает именно такая связка. Реализуя описанный способ, IPB авторизуется в базе DLE и регистрация доступна только в DLE.
     
Статус темы:
Закрыта.