Конфигурирование ресурса#

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

Для загрузки конфигурационных схем в IDMX пользователю потребуется роль Суперпользователь. Подробнее смотрите в разделе Параметры настройки, подраздел Импорт конфигурационных файлов.

Чтобы подключить свой ресурс к IDMX, необходимо создать конфигурационную схему ресурса. IDMX может работать со схемами в форматах XML, YAML и JSON. В примерах этого раздела будет использоваться XML.

Конфигурационная схема начинается с уникального идентификатора объекта (в нашем случае — ресурса), и подключения схем данных Prism. Данные схемы являются пространствами имен для параметров скриптового языка IDMX, и их сокращения будут использоваться в дальнейшем.

При создании XML-конфигурации вручную, ответственность за уникальность идентификатора объекта (oid) лежит на разработчике.

<resource oid="03c3ceea-78e2-11e6-954d-dfdfa9ace0cf"
          xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
          xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
          xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"
          xmlns:ext="http://midpoint.evolveum.com/xml/ns/story/orgsync/ext"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:icfc="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3">
    <name>My Resource</name>
    
</resource>

Внутри тега <resource> нужно указать имя ресурса (тег <name>, которое будет отображаться в UI IDMX, и четыре основных блока — конфигурацию коннектора, схемы данных, политик безопасности и действий синхронизации. Основные блоки указываются внутри тега <resource>, после тега <name>. Примеры смотрите в следующих разделах.

Конфигурация коннектора#

Для конфигурации коннектора, через который IDMX будет подключаться к ресурсу, необходимо задать два основных элемента — сам коннектор, и параметры подключения к ресурсу.

Выбор коннектора#

Выбрать коннектор для подключения можно одним из двух способов — задать напрямую через OID коннектора, либо через поисковый фильтр. Второй способ более удобен, так как позволяет автоматически подключать нужный коннектор, без необходимости поиска и/или обновления уникального идентификатора коннектора.

Коннектор выбирается в блоке <connectorRef>, например:

<resource oid="03c3ceea-78e2-11e6-954d-dfdfa9ace0cf"
          xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
          xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
          xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"
          xmlns:ext="http://midpoint.evolveum.com/xml/ns/story/orgsync/ext"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:icfc="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3">
    <name>My Resource</name>
    <connectorRef oid="028159cc-f976-457f-be70-9e9fa079bcf7"/>
    
</resource>

Для того, чтобы задать коннектор через фильтр, воспользуйтесь тегом <filter>:

<resource oid="03c3ceea-78e2-11e6-954d-dfdfa9ace0cf"
          xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
          xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
          xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"
          xmlns:ext="http://midpoint.evolveum.com/xml/ns/story/orgsync/ext"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:icfc="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3">
    <name>My Resource</name>
    <connectorRef type="ConnectorType">
        <filter>
            <q:equal>
                <q:path>connectorType</q:path>
                <q:value>com.evolveum.polygon.connector.ldap.LdapConnector</q:value>
            </q:equal>
        </filter>
    </connectorRef>
    
</resource>

Для работы с фильтром используется схема Prism Query, подключенная с сокращением q.

В данном примере мы используем простой фильтр <q:equal>, выбирающий объекты IDMX, которые имеют параметр connectorType (тип коннектора, такой параметр есть только у коннекторов) со значением, равным com.evolveum.polygon.connector.ldap.LdapConnector.

Параметры подключения к ресурсу#

Каждый коннектор имеет свой набор параметров, которые требуются для подключения к ресурсу. Параметры подключения задаются через тег <connectorConfiguration>:

<resource oid="03c3ceea-78e2-11e6-954d-dfdfa9ace0cf"
          xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
          xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
          xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"
          xmlns:ext="http://midpoint.evolveum.com/xml/ns/story/orgsync/ext"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <name>My Resource</name>
    <connectorRef type="ConnectorType">
        <filter>
            <q:equal>
                <q:path>connectorType</q:path>
                <q:value>com.evolveum.polygon.connector.ldap.LdapConnector</q:value>
            </q:equal>
        </filter>
    </connectorRef>
    <connectorConfiguration xmlns:icfc="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3"
                            xmlns:icfcldap="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/com.evolveum.polygon.connector-ldap/com.evolveum.polygon.connector.ldap.LdapConnector">
        <icfc:configurationProperties>
            <icfcldap:port>389</icfcldap:port>
            <icfcldap:host>localhost</icfcldap:host>
            <icfcldap:baseContext>dc=example,dc=com</icfcldap:baseContext>
            
        </icfc:configurationProperties>
    </connectorConfiguration>
    
</resource>

Для конфигурации LDAP коннектора, как в примере, используюся Prism схемы с сокращениями icfc и icfcldap.

Конфигурация обработки схемы данных#

После конфигурации коннектора нужно задать обработку данных ресурса. Для этого используется блок <schemaHandling>. В блоке описываются те объекты ресурса, с которыми будет работкать IDMX, и их атрибуты, а также как эти атрибуты сопоставляются с атрибутами объектов IDMX.

Схема данных ресурса составляется IDMX автоматически. Для этого, после подключения ресурса выполните проверку соединения. IDMX автоматически выполняет составление схемы данных ресурса во время процесса проверки соединения.

Для обработки объектов ресурса обычно используется Prism схема с аббревиатурой ri — Resource Instance.

<resource oid="b4101662-7902-11e6-9f14-53e18426fe81"
          xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:t='http://prism.evolveum.com/xml/ns/public/types-3' xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"
          xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
          xmlns:icfc="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3"
          xmlns:my="http://whatever.com/my" xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
          xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3"
          xmlns:cap="http://midpoint.evolveum.com/xml/ns/public/resource/capabilities-3">

    ...

    <schemaHandling>
        <objectType> //Блок, описывающий тип объекта в схеме ресурса и его обработку при синхронизации IDM
            <kind>account</kind> //Тип объекта
            <displayName>Normal Account</displayName> //Отображаемое имя объекта
            <default>true</default>
            <objectClass>ri:inetOrgPerson</objectClass> //Тип объекта
            <attribute> //Блок, описывающий атрибут в схеме и как его обрабатывать
                <ref>ri:dn</ref>  //Ссылка на имя атрибута в ресурсе
                <displayName>Distinguished Name</displayName> //Отображаемой имя атрибута в IDM
                <limitations> //Ограничения для обработки со стороны IDM
                    <minOccurs>0</minOccurs> //Минимальное количество появлений атрибута в объектах ресурса
                    <access>  //Разрешения для взаимодействия с объектами
                        <read>true</read>
                        <add>true</add>
                        <modify>true</modify>
                    </access>
                </limitations>
                <outbound> //Конфигурация для исходящего маппинга
                    <source> //Источник значения для передачи через исходящий маппинг
                        <path>name</path>
                    </source>
                    <expression> //Описание действий над значением перед его передачей в ресурс
                        <script>
                            <code>
                                basic.composeDnWithSuffix('uid', name + iterationToken, 'ou=people,dc=example,dc=com') //Скрипт, формирующий итоговое значение
                            </code>
                        </script>
                    </expression>
                </outbound>
            </attribute>
            <attribute>
                <ref>ri:entryUUID</ref>
                <displayName>Entry UUID</displayName>
                <limitations>
                    <access>
                        <read>true</read>
                        <add>false</add>
                        <modify>true</modify>
                    </access>
                </limitations>
            </attribute>
            <attribute>
                <ref>ri:cn</ref>
                <displayName>Common Name</displayName>
                <limitations>
                    <minOccurs>0</minOccurs>
                    <access>
                        <read>true</read>
                        <add>true</add>
                        <modify>true</modify>
                    </access>
                </limitations>
                <outbound>
                    <source>
                        <path>name</path>
                    </source>
                </outbound>
            </attribute>
            <attribute>
                <ref>ri:sn</ref>
                <displayName>Surname</displayName>
                <limitations>
                    <minOccurs>0</minOccurs>
                </limitations>
                <outbound>
                    <source>
                        <path>familyName</path>
                    </source>
                </outbound>
                <inbound> //Конфигурация для входящего маппинга
                    <target> //Описание целевого атрибута в объекте IDM, в который будет записываться значение из ресурса
                        <path>familyName</path> //Путь до и имя целевого атрибута
                    </target>
                </inbound>
            </attribute>
            <attribute>
                <ref>ri:givenName</ref>
                <displayName>Given Name</displayName>
                <outbound>
                    <source>
                        <path>givenName</path>
                    </source>
                </outbound>
                <inbound>
                    <target>
                        <path>givenName</path>
                    </target>
                </inbound>
            </attribute>
            <attribute>
                <ref>ri:uid</ref>
                <displayName>Login Name</displayName>
                <outbound>
                    <strength>weak</strength> //Сила маппинга. Подробнее смотрите в разделе Маппинги
                    <source>
                        <path>name</path>
                    </source>
                    <expression>
                        <script>
                            <code>name + iterationToken</code>
                        </script>
                    </expression>
                </outbound>
                <inbound>
                    <target>
                        <path>name</path>
                    </target>
                </inbound>
            </attribute>
            <attribute>
                <ref>ri:description</ref>
                <outbound>
                    <strength>weak</strength>
                    <expression>
                        <value>Created by midPoint</value>
                    </expression>
                </outbound>
            </attribute>
            <attribute>
                <ref>ri:mail</ref>
                <displayName>Mail</displayName>
                <tolerant>false</tolerant>
                <outbound>
                    <strength>strong</strength>
                    <source>
                        <path>emailAddress</path>
                    </source>
                </outbound>
            </attribute>
            <attribute>
                <ref>ri:l</ref>
                <displayName>Location</displayName>
                <outbound>
                    <source>
                        <path>locality</path>
                    </source>
                </outbound>
            </attribute>
            <attribute>
                <ref>ri:employeeType</ref>
                <displayName>Employee Type</displayName>
                <tolerant>false</tolerant>
                <outbound>
                    <strength>strong</strength>
                    <source>
                        <path>subtype</path>
                    </source>
                </outbound>
            </attribute>
            <attribute>
                <ref>ri:employeeNumber</ref>
                <displayName>Employee Number</displayName>
                <tolerant>false</tolerant>
                <outbound>
                    <strength>strong</strength>
                    <source>
                        <path>employeeNumber</path>
                    </source>
                </outbound>
            </attribute>

            <association> //Конфигурация привязки создаваемых объектов по атрибуту
                <ref>ri:ldapGroup</ref>
                <displayName>LDAP Group Membership</displayName>
                <kind>entitlement</kind>
                <intent>ldapGroup</intent>
                <direction>objectToSubject</direction>
                <associationAttribute>ri:member</associationAttribute>
                <valueAttribute>ri:dn</valueAttribute>
            </association>

            <iteration>
                <maxIterations>5</maxIterations>
            </iteration>

            <protected> //Конфигурация защищенных полей
                <filter> //Конфигурация поискового фильтра
                    <q:equal>
                        <q:matching>http://prism.evolveum.com/xml/ns/public/matching-rule-3#stringIgnoreCase</q:matching>
                        <q:path>attributes/ri:dn</q:path>
                        <q:value>cn=idm,ou=Administrators,dc=example,dc=com</q:value>
                    </q:equal>
                </filter>
            </protected>

            <activation> //Конфигурация активации учетных карточек и записей
                <administrativeStatus> //Конфигурация связи административного статуса
                    <outbound />
                    <inbound>
                        <strength>weak</strength>
                        <expression>
                            <asIs />
                        </expression>
                    </inbound>
                </administrativeStatus>
                <lockoutStatus>
                    <outbound/>
                </lockoutStatus>
            </activation>

            <credentials> //Конфигурация маппинга паролей для учетных записей
                <password>
                    <outbound> //Исходящий пароль (из IDM в ресурс) передается как есть
                        <expression>
                            <asIs />
                        </expression>
                    </outbound>
                    <inbound> //Входящий пароль генерируется в IDM только в случае если поле пусто. Подробнее смотрите описание силы маппингов в разделе Маппинги
                        <strength>weak</strength>
                        <expression>
                            <generate />
                        </expression>
                    </inbound>
                </password>
            </credentials>

        </objectType>

        <objectType>
            <kind>entitlement</kind>
            <intent>ldapGroup</intent>
            <displayName>LDAP Group</displayName>
            <objectClass>ri:groupOfNames</objectClass>
            <baseContext>
                <objectClass>ri:organizationalUnit</objectClass>
                <filter>
                    <q:equal>
                        <q:path>attributes/dn</q:path>
                        <q:value>ou=groups,dc=example,dc=com</q:value>
                    </q:equal>
                </filter>
            </baseContext>

            <attribute>
                <ref>ri:dn</ref>
                <outbound>
                    <source>
                        <path>name</path>
                    </source>
                    <expression>
                        <script>
                            <code>
                                basic.composeDnWithSuffix('cn', name, 'ou=groups,dc=example,dc=com');
                            </code>
                        </script>
                    </expression>
                </outbound>
            </attribute>
            <attribute>
                <ref>ri:member</ref>
                <fetchStrategy>minimal</fetchStrategy>
                <outbound>
                    <strength>weak</strength>
                    <expression>
                        <value>cn=fake,dc=example,dc=com</value>
                    </expression>
                </outbound>
            </attribute>
            <attribute>
                <ref>ri:cn</ref>
                <outbound>
                    <strength>weak</strength>
                    <source>
                        <path>name</path>
                    </source>
                </outbound>
            </attribute>
            <configuredCapabilities>
                <cap:pagedSearch>
                    <cap:defaultSortField>ri:cn</cap:defaultSortField>
                </cap:pagedSearch>
            </configuredCapabilities>
        </objectType>

    </schemaHandling>

    ...
</resource>

Схема данных отвечает не только за сопоставление атрибутов. В этом блоке можно настроить как входящие, так и исходящие маппинги атрибутов, ролей, назначений и других объектов IDMX. Подробнее смотрите в разделе Маппинги.

Конфигурация синхронизации карточек и записей#

Элемент <synchronization> содержит настройки механизмов синхронизации данных между IDMX и подключаемым ресурсом. В данном блоке определяются критерии фильтрации, по которым отслеживаются изменения в объектах, и действия с этими объектами при каком-либо изменении объекта.

Например:

<resource oid="b4101662-7902-11e6-9f14-53e18426fe81"
          xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:t='http://prism.evolveum.com/xml/ns/public/types-3' xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"
          xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
          xmlns:icfc="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3"
          xmlns:my="http://whatever.com/my" xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
          xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3"
          xmlns:cap="http://midpoint.evolveum.com/xml/ns/public/resource/capabilities-3">

    ...

    <synchronization>
        <objectSynchronization>
            <enabled>true</enabled>
            <correlation>
                <q:equal>
                    <q:path>c:name</q:path>
                    <expression>
                        <path>$projection/attributes/empno</path>
                    </expression>
                </q:equal>
            </correlation>
            <reaction>
                <situation>linked</situation>
                <synchronize>true</synchronize>
            </reaction>
            <reaction>
                <situation>deleted</situation>
                <synchronize>true</synchronize>
                <action>
                    <handlerUri>http://midpoint.evolveum.com/xml/ns/public/model/action-3#deleteFocus</handlerUri>
                </action>
            </reaction>
            <reaction>
                <situation>unlinked</situation>
                <synchronize>true</synchronize>
                <action>
                    <handlerUri>http://midpoint.evolveum.com/xml/ns/public/model/action-3#link</handlerUri>
                </action>
            </reaction>
            <reaction>
                <situation>unmatched</situation>
                <synchronize>true</synchronize>
                <action>
                    <handlerUri>http://midpoint.evolveum.com/xml/ns/public/model/action-3#addFocus</handlerUri>
                </action>
            </reaction>
        </objectSynchronization>
    </synchronization>

</resource>

Подробнее о синхронизации смотрите в разделе Синхронизация.