# LDAP-синхронизация

В статье описано, как настроить LDAP-синхронизацию пользователей в системе и выполнить импорт пользователей из службы каталогов.

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

В общем виде работа с LDAP-синхронизацией включает следующие шаги:

1. Настройте параметры LDAP-синхронизации и подключение к доменам.
2. Настройте назначение прав для синхронизируемых пользователей.
3. Откройте список пользователей и запустите синхронизацию.
4. Проверьте отчет о выполнении операции и результат загрузки пользователей и доменных групп.

## Как работает синхронизация

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

При синхронизации система сопоставляет пользователей по имени пользователя. Если запись с таким именем уже существует в системе, используется существующий пользователь. Если пользователь не найден, он может быть создан в системе при включенной настройке **Создавать физ лицо**.

В ходе синхронизации система выполняет следующие действия:

1. Определяет пользователя или создает его, если включена настройка **Создавать физ лицо**.
2. Определяет объект `Bs_Person` и объект `Bs_Employ` или создает их при отсутствии. Для создания этих объектов используются данные, полученные из LDAP.
3. Определяет, в какие доменные группы и подгруппы входит пользователь.
4. На основе данных пользователя, связанных с ним объектов `Bs_Person` и `Bs_Employ`, а также его доменных групп проверяет, существуют ли в классе `Bs_OFStructureUserGroupLink` настроенные соответствия.
5. Если такие соответствия найдены, пользователю назначаются соответствующие профили и другие настройки доступа.

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

## Какие данные загружаются из LDAP

При синхронизации из LDAP в систему загружаются и обновляются следующие данные:

- ФИО физического лица;
- логин пользователя;
- значение пароля, которое используется при создании пользователя;
- email;
- флаг заблокированности;
- доменные группы;
- департамент;
- должность;
- описание.

Эти данные используются при создании или обновлении пользователя, а также связанных с ним объектов и настроек доступа.

### Синхронизируемые поля пользователя

Для пользователя синхронизируются следующие поля:

- `Системное имя` — атрибут `sAMAccountName`, если он пустой, используется `uid`;
- `Пароль` — при создании пользователя равен системному имени;
- `Группа` — определяется через атрибут `memberOf`;
- `Подразделение Active Directory` — атрибут `department`;
- `Наименование Active Directory` — атрибут `title`;
- `Описание Active Directory` — атрибут `description`.

### Синхронизируемые поля физического лица

Для физического лица синхронизируются следующие поля:

- `Фамилия` — первое слово из атрибута `displayName`, если в нем три слова; в остальных случаях — атрибут `sn`;
- `Имя` — второе слово из атрибута `displayName`, если в нем три слова; первое слово из атрибута `givenName`, если в нем два слова; в остальных случаях — атрибут `givenName` целиком;
- `Отчество` — третье слово из атрибута `displayName`, если в нем три слова; второе слово из атрибута `givenName`, если в нем два слова;
- `email` — атрибут `mail`.

### Синхронизируемые поля групп

Для доменных групп синхронизируются следующие поля:

- `Наименование` — атрибут `name`, если он не указан, используется полное имя группы, например `CN=Domain users,CN=Users`;
- `Системное имя` — полное имя группы.

## Настройки LDAP-синхронизации

Для настройки синхронизации пользователей откройте приложение **Настройка системы** и перейдите в раздел `Настройки и сервисы > Настройки модулей системы > Общие настройки модулей > Btk > LDAP-синхронизация`.

![2](/img/Img162(BtkSettings).png)

После открытия раздела отобразится окно настроек LDAP-синхронизации.

![3](/img/Img163(LDAPSettings).png)

В таблице ниже приведены основные параметры настройки LDAP-синхронизации.

| Наименование | Описание |
|---|---|
| Создавать физ лицо | Если настройка выключена, для пользователей, появившихся в результате синхронизации, система ищет соответствующее физическое лицо (`Bs_Person`) по совпадению фамилии, имени и отчества. В найденном физическом лице устанавливается ссылка на пользователя и email, если он передан из LDAP. Если настройка включена, для пользователей, у которых не удалось найти существующее физическое лицо, создается новое физическое лицо с ФИО и email из LDAP |
| Тип синхронизации | **Пользователи группы** — загружает из указанных доменов заданную группу, ее подгруппы и входящих в них пользователей с сохранением доменной структуры. Для этого режима нужно заполнить настройку **Фильтр по группе**.<br/><br/>**Все пользователи** — загружает из заданных доменов всех пользователей и доменные группы с сохранением структуры, если это возможно |
| Фильтр по группе | Полное название группы, члены которой должны быть синхронизированы. Значение задается в формате `CN=...,OU=...,DC=...`. Используется только при выборе типа синхронизации **Пользователи группы** |
| Домены | Список доменов, в которых система выполняет поиск пользователей и доменных групп |

**Пример настройки LDAP-синхронизации**

<!-- Начало кода -->
```json
{"jArrayDomains":[{"sDomain":"local.local","sLogin":"admin@local.local","sUrl":"ldap://<IP_ADDRESS>:<PORT>","sPass":"EncryptedStorage:<PASS>"}],"sGroupFilter":null,"idSyncType":2}
```
<!-- Конец кода -->

**Пример настройки Quartz**

<!-- Начало кода -->
```json
{"database":"<DATABASE>","pass":"<PASSWORD>","soapReqStr":"/app/sys/soap/sys-service-1.0.0","publicKey":"<PUB_KEY>","login":"<LOGIN>","soapPort":80,"restAcquireJobReqStr":"/app/sys/rest/ss/pkg/Btk_QuartzRestPkg/getactivejobs","soapHost":"pg.local"}
```
<!-- Конец кода -->

Параметр **Домены** содержит список настроек доменов. Ниже приведены параметры отдельной доменной настройки.

Окно настройки домена показано на скриншоте ниже.

![6](/img/Img165(DomainSetting).png)

Настройки домена определяют параметры подключения к LDAP-серверу и правила формирования системного имени пользователя.

| Наименование | Описание |
|---|---|
| Добавить домен к пользователю | Если настройка включена, система добавляет домен к системному имени пользователя в формате `User@Domain` |
| Домен | Домен, в котором система выполняет поиск пользователей |
| Логин | Учетная запись, от имени которой система подключается к домену |
| Пароль | Пароль учетной записи, используемой для подключения к домену |
| URL | Адрес LDAP-сервера, который система использует для подключения к домену |

**Пример настройки доменов**

<!-- Начало кода -->
```json
[{"sDomain":"local.local","sLogin":"admin@local.local","sUrl":"ldap://<IP_ADDRESS>:<PORT>","sPass":"EncryptedStorage:<PASS>"}]
```
<!-- Конец кода -->

## Настройка прав для синхронизируемых пользователей

Назначение прав по доменным группам настраивается через класс **`Bs_OFStructureUserGroupLink`** (Соответствие групп пользователей и ОФС).

Общий принцип настройки следующий:

1. В классе **`Bs_OFStructureUserGroupLink`** вручную задаются пары вида **доменная группа — объект ОФС**.
2. Для объекта ОФС, указанного в такой связке, в карточке настраиваются профили, которые будут назначаться пользователю.

[Детальнее про настройку ОФС](https://help.globalerp.ru/books/User_guide_basic/SNAPSHOT/html/010_sprav/020_%D0%BE%D1%84%D1%81.html#id3). 

Если для группы пользователя настроена связь с ОФС, для сотрудника создается запись в `Bs_OFSEmployee`. Если у связанной ОФС настроены профили доступа, они применяются и к пользователю.

## Как запустить синхронизацию

После заполнения параметров LDAP-синхронизации, настройки доменов и правил назначения прав можно запустить синхронизацию в приложении **Администратор**.

1. Откройте раздел `Доступ > Пользователи`.
2. В списке пользователей раскройте выпадающий список у операции с молоточком.
3. Выберите операцию **Синхронизация пользователей Active Directory**.

![img_6.png](/img/Img167(SyncOperation).png)

После этого откроется окно синхронизации.

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

## Шаблон для новых пользователей

Шаблон позволяет автоматически назначить новым пользователям настройки доступа при синхронизации.

В качестве шаблона используется пользователь, для которого установлен признак **Является шаблоном**. Такие пользователи отображаются в списке выбора в поле **Шаблон, применяемый к новым пользователям**.

Общий порядок работы с шаблоном:

1. Создайте пользователя, который будет использоваться как шаблон.
2. Установите для него признак **Является шаблоном**.
3. Назначьте этому пользователю необходимые профили и другие настройки доступа.
4. При запуске синхронизации выберите этот шаблон в поле **Шаблон, применяемый к новым пользователям**.

При создании нового пользователя система применяет к нему все настройки шаблона. После этого часть значений заполняется данными из LDAP и перезаписывает соответствующие поля шаблона. К таким значениям относятся пароль, имя пользователя, `AdDepartment`, `AdTitle` и `AdDescription`. Остальные настройки сохраняются из шаблона.

Использование шаблона позволяет не назначать права каждому новому пользователю вручную. Шаблон можно использовать как один из способов автоматической настройки новых пользователей при загрузке из LDAP.

## Результат синхронизации

![img_7.png](/img/Img168(SyncWindow).png)

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

Пользователи создаются только в том случае, если они не заблокированы в домене. Если пользователь заблокирован и уже зарегистрирован в системе, ему устанавливается признак `Заблокирован`.

При повторной синхронизации система обновляет ранее загруженных пользователей. Если в домене найдены пользователи, которые еще не были загружены в систему, они создаются при синхронизации при включенной настройке **Создавать физ лицо**. Данные, полученные из LDAP, при повторной синхронизации обновляются. Признак блокировки также синхронизируется: если пользователь заблокирован в директории, его учетная запись блокируется и в системе.

Структура загруженных данных выглядит следующим образом:

- Все пользователи
  - LDAP - Active Directory
    - Домен: название первого домена
    - Домен: название второго домена
    - ...
    - Домен: название последнего домена

Пример итогового результата показан на скриншоте ниже.

![img_8.png](/img/Img169(SyncResult).png)

## Особенности работы

При использовании LDAP-синхронизации учитывайте следующее:

- в систему загружаются пользователи и доменные группы;
- из LDAP загружаются и обновляются ФИО, логин, пароль, email, флаг заблокированности, доменные группы, департамент, должность и описание;
- `Bs_Person` и `Bs_Employ` создаются только при отсутствии;
- права и профили могут назначаться как через шаблон нового пользователя, так и через настроенные соответствия доменных групп;
- если пользователь входит во вложенную доменную подгруппу, права могут назначаться и по вышестоящим группам, для которых настроены соответствия.