Импорт пользователей с сохранением паролей от старой базы банных
Импорт пользователей с сохранением паролей от старой базы банных
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
Перенос пользователей из другой системы
В целом, задача импорта пользователей из другой системы не такая уж и сложная: достаточно создать 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:
В этом обработчике при импорте, после добавления пользователя, будет происходить добавление логина и зашифрованного пароля в отдельную таблицу, назовём её "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.