Yandex Metrika
sanches.free 3 просмотра

Новый администратор Битрикс через SQL: клон пользователя, группы и права доступа

Идея

Служебный или запасной вход удобно собрать как копию учётной записи, у которой уже есть нужные группы и строки в b_user_access (часто это первая учётка или логин вида admin). Числовой ID новой строки заранее неизвестен — его выдаёт автоинкремент, после чего его читают из LAST_INSERT_ID() в той же сессии клиента MySQL.

Клонирование строки b_user

Перечень полей ниже соответствует распространённой схеме «1С-Битрикс: Управление сайтом»; если у вас добавлялись пользовательские столбцы, расширьте список. Во вставке участвуют все поля кроме ID. Во LOGIN и EMAIL на время вставки подставляются уникальные временные значения, чтобы не упереться в уникальные индексы; окончательные задаёт UPDATE.

INSERT INTO `b_user` (
  `TIMESTAMP_X`, `LOGIN`, `PASSWORD`, `CHECKWORD`, `ACTIVE`, `NAME`, `LAST_NAME`, `EMAIL`, `LAST_LOGIN`, `DATE_REGISTER`, `LID`,
  `PERSONAL_PROFESSION`, `PERSONAL_WWW`, `PERSONAL_ICQ`, `PERSONAL_GENDER`, `PERSONAL_BIRTHDATE`, `PERSONAL_PHOTO`, `PERSONAL_PHONE`, `PERSONAL_FAX`, `PERSONAL_MOBILE`, `PERSONAL_PAGER`,
  `PERSONAL_STREET`, `PERSONAL_MAILBOX`, `PERSONAL_CITY`, `PERSONAL_STATE`, `PERSONAL_ZIP`, `PERSONAL_COUNTRY`, `PERSONAL_NOTES`,
  `WORK_COMPANY`, `WORK_DEPARTMENT`, `WORK_POSITION`, `WORK_WWW`, `WORK_PHONE`, `WORK_FAX`, `WORK_PAGER`, `WORK_STREET`, `WORK_MAILBOX`, `WORK_CITY`, `WORK_STATE`, `WORK_ZIP`, `WORK_COUNTRY`, `WORK_PROFILE`, `WORK_LOGO`, `WORK_NOTES`,
  `ADMIN_NOTES`, `STORED_HASH`, `XML_ID`, `PERSONAL_BIRTHDAY`, `EXTERNAL_AUTH_ID`, `CHECKWORD_TIME`, `SECOND_NAME`, `CONFIRM_CODE`, `LOGIN_ATTEMPTS`, `LAST_ACTIVITY_DATE`, `AUTO_TIME_ZONE`, `TIME_ZONE`, `TIME_ZONE_OFFSET`
)
SELECT
  `TIMESTAMP_X`,
  CONCAT('_tmp_', UNIX_TIMESTAMP(), '_', `LOGIN`),
  `PASSWORD`, `CHECKWORD`, `ACTIVE`, `NAME`, `LAST_NAME`,
  CONCAT(UNIX_TIMESTAMP(), '+tmp@', `EMAIL`),
  `LAST_LOGIN`, `DATE_REGISTER`, `LID`,
  `PERSONAL_PROFESSION`, `PERSONAL_WWW`, `PERSONAL_ICQ`, `PERSONAL_GENDER`, `PERSONAL_BIRTHDATE`, `PERSONAL_PHOTO`, `PERSONAL_PHONE`, `PERSONAL_FAX`, `PERSONAL_MOBILE`, `PERSONAL_PAGER`,
  `PERSONAL_STREET`, `PERSONAL_MAILBOX`, `PERSONAL_CITY`, `PERSONAL_STATE`, `PERSONAL_ZIP`, `PERSONAL_COUNTRY`, `PERSONAL_NOTES`,
  `WORK_COMPANY`, `WORK_DEPARTMENT`, `WORK_POSITION`, `WORK_WWW`, `WORK_PHONE`, `WORK_FAX`, `WORK_PAGER`, `WORK_STREET`, `WORK_MAILBOX`, `WORK_CITY`, `WORK_STATE`, `WORK_ZIP`, `WORK_COUNTRY`, `WORK_PROFILE`, `WORK_LOGO`, `WORK_NOTES`,
  `ADMIN_NOTES`, `STORED_HASH`, `XML_ID`, `PERSONAL_BIRTHDAY`, `EXTERNAL_AUTH_ID`, `CHECKWORD_TIME`, `SECOND_NAME`, `CONFIRM_CODE`, `LOGIN_ATTEMPTS`, `LAST_ACTIVITY_DATE`, `AUTO_TIME_ZONE`, `TIME_ZONE`, `TIME_ZONE_OFFSET`
FROM `b_user`
WHERE `LOGIN` = 'admin' AND `ACTIVE` = 'Y'
LIMIT 1;

SELECT LAST_INSERT_ID() AS `new_user_id`;
SET @new_uid := LAST_INSERT_ID();

UPDATE `b_user`
SET `LOGIN` = 'new_admin_login',
    `NAME` = 'Reserve admin',
    `EMAIL` = 'new-admin@site.example'
WHERE `ID` = @new_uid;

Группы и b_user_access

Состав групп и расширенные права переносят с эталона @src_uid (часто 1). Привязки у нового пользователя предварительно очищаются, чтобы не смешивать с прошлыми попытками.

SET @src_uid := 1;

DELETE FROM `b_user_group` WHERE `USER_ID` = @new_uid;
INSERT INTO `b_user_group` (`USER_ID`, `GROUP_ID`, `DATE_ACTIVE_FROM`, `DATE_ACTIVE_TO`)
SELECT @new_uid, `GROUP_ID`, `DATE_ACTIVE_FROM`, `DATE_ACTIVE_TO`
FROM `b_user_group` WHERE `USER_ID` = @src_uid;

DELETE FROM `b_user_access` WHERE `USER_ID` = @new_uid;
INSERT INTO `b_user_access` (`USER_ID`, `PROVIDER_ID`, `ACCESS_CODE`)
SELECT @new_uid, `PROVIDER_ID`, `ACCESS_CODE`
FROM `b_user_access` WHERE `USER_ID` = @src_uid;

Пароль и отдельное повышение прав

Разумно задать доступный пароль через форму восстановления по почте (/auth/forgot.php?forgot_password=yes) или штатный скрипт восстановления администратора из обучающего курса 1С-Битрикс. Если нужно лишь добавить права уже существующему USER_ID, административная группа имеет GROUP_ID = 1:

INSERT INTO `b_user_group` (`USER_ID`, `GROUP_ID`)
VALUES (42, 1);

Число 42 здесь — пример осознанного существующего идентификатора; оно не связано с только что созданной строкой.

Осторожность

  • Работайте на бэкапе или в транзакции с проверкой результата перед COMMIT.
  • После правок в БД может понадобиться сброс связанного кеша авторизации.
  • Для промышленной политики пользователей предпочтительны штатные средства; прямой SQL оставляют для аварии и документированного отката.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии