+7 495 008 8452
  • Загрузка
Выберите ваш цвет

Импорт пользователей с сохранением паролей от старой базы банных

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


Перенос пользователей из другой системы

В целом, задача импорта пользователей из другой системы не такая уж и сложная: достаточно создать CSV-файл со списком пользователей, в котором будут заполнены как минимум поля "NAME" и "LAST_NAME"(Импорт пользователей из CSV-файла).
Но есть одна загвоздка: пароли пользователей, в большинстве случаев, хранятся в зашифрованном виде и сохранить эти пароли в базе Битрикса сразу нельзя. Чтобы решить эту задачу, потребуется прибегнуть к небольшой хитрости.
Весь процесс можно разделить на 3 шага.


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


NAME LAST_NAME LOGIN PASSWORD
Иван Иванов ivan $P$BMcujdtDPda5n0WhJWl81tPGAlyrCw.
Пётр Петров test $P$BP9Z.C4z2YkgJ6JibnhA2UKPPwlqZo.
Антон Шпак user $P$BsAjJCwkgTm3jmgwUYxlhgCenydAB./


2. Как уже упоминалось выше, поле "PASSWORD", скорее всего, будет содержать зашифрованное значение. Чтобы пользователь не заметил смены движка и дальше продолжал пользоваться функционалом сайта, но при этом мы могли бы записать корректное значение пароля в базу Битрикса, пользователю потребуется заново авторизоваться. Вот тут-то мы и определим пароль, сравнив зашифрованное значение, загруженное из CSV-файла, со значением, отправленным пользователем при авторизации, используя алгоритм из старой системы, который Вам потребуется скопировать.
Перед импортом необходимо в файле "/bitrix/php_interface/init.php" вставить обработчик события OnAfterUserAdd:
AddEventHandler("main", "OnAfterUserAdd", "__afterUserAdd");
function __afterUserAdd($arParams)
{
    if(defined("USER_IMPORT_EXECUTION_TIME"))
    {
        global $DB;
        
        $DB->Ins ert("old_user", array(
            "LOGIN" => "'".$DB->ForSQL($arParams["LOGIN"])."'",
            "HASH" => "'".$DB->ForSQL($arParams["PASSWORD"])."'"
        ));
    }
}
В этом обработчике при импорте, после добавления пользователя, будет происходить добавление логина и зашифрованного пароля в отдельную таблицу, назовём её "old_user". Создать таблицу можно в "Настройки - Инструменты - SQL-запрос", выполнив запрос:
CRE ATE TABLE `old_user` (
  `LOGIN` varchar(60) NOT NULL,
  `HASH` varchar(64) NOT NULL,
  PRIMARY KEY (`LOGIN`)
);
Затем запустите CSV-импорт и убедитесь, что таблица "old_user" заполнилась.


3. На следующем и последнем шаге удалите из файла "/bitrix/php_interface/init.php" вставленный код и вставьте новый:
AddEventHandler("main", "OnBeforeUserLogin", "__beforeUserLogin");
function __beforeUserLogin($arParams)
{
    global $DB;

    $login = $DB->ForSQL($arParams["LOGIN"]);
    $password = $arParams["PASSWORD"];
    $from_old = "FROM old_user wh ere LOGIN='$login';";
    
    // Ищем пользователя с таким логином в "old_user"
    $rsOLDUser = $DB->Query("SELECT * $from_old");
    if(!($arOLDUser = $rsOLDUser->GetNext()))
        return true;
    
    // Ищем пользователя с таким логином в базе Битрикса
    $rsBXUser = CUser::GetByLogin($login);
    if(!($arBXUser = $rsBXUser->GetNext()))
        return true;
    
    // Проверяем правильность присланного пароля
    // алгоритмом старой системы
    // (в данном случае это worpress 3.3.1)
    require_once('wp-class-phpass.php');
    $wp_hasher = new PasswordHash(8, TRUE);
    if(!$wp_hasher->CheckPassword($password, $arOLDUser['HASH']))
        return true;
    
    // Обновляем пароль пользователя в базе Битрикса
    $USER = new CUser;
    $bUbdate = $USER->Update($arBXUser["ID"], array("PASSWORD" => $password));
    unset($USER);
    if(!$bUbdate)
        return true;
    
    // А затем удаляем пользователя из "old_user"
    $DB->Query("DELETE $from_old");
    return true;
}
Этот код будет решать основную задачу, которую я описал выше: сопоставлять отправленный пользователем пароль с имеющимися в таблице "old_user" и записывать его, в случае совпадения, в таблицу Битрикса.


Периодически Вы можете просматривать содержимое таблицы "old_user". Когда таблица "old_user" опустеет, Вы можете удалить её, как и код, указанный на 3 шаге.
Стоит также учесть, что пользователь может захотеть изменить пароль. Это можно запретить для пользователей, находящихся в таблице "old_user", создав обработчик события OnSendUserInfo.

 

 

Источник: http://dev.1c-bitrix.ru/community/webdev/user/42405/blog/perenos-polzovateley-iz-drugoy-sistemy/

Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...