Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
devel:documentation:systems:dev:system-mapping [2019/07/02 09:17] – [System scheme] svandav | devel:documentation:systems:dev:system-mapping [2025/03/13 00:35] (current) – [Mapping priority (since 14.7.0, 15.1.0)] koulaj | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Connector configuration and attribute mapping ====== | ====== Connector configuration and attribute mapping ====== | ||
- | {{tag> | + | |
+ | {{tag> | ||
===== Connector configuration ===== | ===== Connector configuration ===== | ||
- | Creation of a newly connected system will be demonstrated on a database connector (ConnIdDBBundle). | ||
- | Firstly, we will create a new system named **Table** and choose the database connector. | ||
- | All settings for this connector are available in the **Configuration** tab. | ||
- | In the picture below is an example of the configuration: | ||
- | <note tip>The configuration below is only an example.The system in its default state doesn' | ||
- | {{ : | ||
+ | {{tag> | ||
+ | |||
+ | Creation of a newly connected system will be demonstrated on a database connector (ConnIdDBBundle). Firstly, we will create a new system named **Table** and choose the database connector. All settings for this connector are available in the **Configuration** tab. In the picture below is an example of the configuration: | ||
==== Connector pool configuration ==== | ==== Connector pool configuration ==== | ||
+ | |||
+ | {{tag> | ||
**The connector pool** is a very useful feature that avoids unnecessarily creating a new connector instance each time a connector is called. Typically, each connector instance also creates a connection to that target system. It is effective to maintain these connections for **longer periods and for multiple calls**. | **The connector pool** is a very useful feature that avoids unnecessarily creating a new connector instance each time a connector is called. Typically, each connector instance also creates a connection to that target system. It is effective to maintain these connections for **longer periods and for multiple calls**. | ||
Line 18: | Line 18: | ||
The last advantage is the ability to use **multiple connections** to one target system, which is especially advantageous during parallel processing. | The last advantage is the ability to use **multiple connections** to one target system, which is especially advantageous during parallel processing. | ||
- | |||
=== Pool configurations: | === Pool configurations: | ||
- | | + | |
+ | | ||
* **Max idle objects** | * **Max idle objects** | ||
* **Minimum number of idle objects** | * **Minimum number of idle objects** | ||
- | * **Max objects** - Max number of objects in the pool. | + | * **Max objects** |
- | * **Max time to wait** - Max time to wait for free object in the pool. | + | * **Max time to wait** |
- | * **Minimum time to wait before evicting** - Minimum time to wait befor evicting idle object. | + | * **Minimum time to wait before evicting** |
<note important> | <note important> | ||
<note tip>Pool configuration is persisted in EAV attributes and use form definition with code " | <note tip>Pool configuration is persisted in EAV attributes and use form definition with code " | ||
+ | {{ .: | ||
- | {{ : | + | ==== Additional connector configuration ==== |
- | + | {{tag> | |
+ | |||
+ | The additional connector configuration tab lets you configure so called operation options for each type of connector. These options are then passed to each invocation of given connector. This enables us to further tweak connection paramters for each system, such as list of attributes, which should be returned from target system. | ||
+ | |||
+ | Each system has its own set of operation options. By default, only PAGE_SIZE and ATTRS_TO_GET is available for each connector, but you can easily add other options using corresponding form definition. | ||
+ | |||
+ | === Example operation options: === | ||
+ | |||
+ | * **PAGE\_SIZE** | ||
+ | * **ATTRS\_TO\_GET** | ||
+ | <note tip> | ||
+ | |||
+ | {{ .: | ||
===== System scheme ===== | ===== System scheme ===== | ||
+ | |||
{{tag> | {{tag> | ||
- | When the connector is configured correctly, we can move on to the **System scheme** tab. There, we will create the scheme either manually or we will use the scheme which will be returned by the connector itself (according to the filled-in configuration). | + | |
+ | When the connector is configured correctly, we can move on to the **System scheme** | ||
The scheme will be automatically created by pressing **Generate scheme**. | The scheme will be automatically created by pressing **Generate scheme**. | ||
+ | {{ .: | ||
- | {{ : | + | After a successful generation, there should be a new entry (object class) **\__ACCOUNT\__** |
- | + | ||
- | + | ||
- | After a successful generation, there should be a new entry (object class) **\__ACCOUNT\__** in the object types table. | + | |
- | This entry will contain available attributes in the system (for object ACCOUNT). In our case, it will contain an attribute for each column in the mapped table and the semantic attributes: | + | |
- | * **\__NAME\__** - attribute identifying the account in the system (user name). | + | |
- | * **\__PASSWORD\__** - attribute for password mapping for the given account. | + | |
- | * **\__ENABLE\__** - attribute for mapping the indication whether the account is enabled or disabled. | + | |
+ | * **\__NAME\__** | ||
+ | * **\__PASSWORD\__** | ||
+ | * **\__ENABLE\__** | ||
===== Attribute mapping ===== | ===== Attribute mapping ===== | ||
+ | |||
{{tag> | {{tag> | ||
- | When the system scheme is created, we can move on to attribute mapping in the **Attribute mapping** tab. Mapping serves two basic purposes: | + | When the system scheme is created, we can move on to attribute mapping in the **Attribute mapping** |
- **Making the scheme attributes accessible in the IdM system**. Only mapped attributes can be used in IdM for active operations (provisioning/ | - **Making the scheme attributes accessible in the IdM system**. Only mapped attributes can be used in IdM for active operations (provisioning/ | ||
- | - **It defines which value will the attribute be mapped into in the IdM system.** (identity, group, extended attribute, hidden attribute). | + | - **It defines which value will the attribute be mapped into in the IdM system.** |
- | + | Firstly, we will create a group (operation type and entity type) which we would like to map. We will select **Provisioning** | |
- | Firstly, we will create a group (operation type and entity type) which we would like to map. We will select **Provisioning** and **Identity**. Then we will start creating the individual mappings. | + | |
- | It is very important to create a mapping for the account identifier in the system and connect it correctly to the IdM identity. This is done by adding a new attribute. | + | |
**In the attribute mapping details we will fill in**: | **In the attribute mapping details we will fill in**: | ||
- | | + | |
+ | | ||
* Fill in the name of the mapped attribute. It is pre-filled with the scheme attribute name but any other name can be used. | * Fill in the name of the mapped attribute. It is pre-filled with the scheme attribute name but any other name can be used. | ||
* Tick **Is identifier**. | * Tick **Is identifier**. | ||
* Tick **Entity attribute**. The attribute will be tied to the user name of the identity in IdM. | * Tick **Entity attribute**. The attribute will be tied to the user name of the identity in IdM. | ||
- | * Fill in **username** as the **IdM key**. | + | * Fill in **username** |
- | {{ : | + | {{ .: |
<note tip> | <note tip> | ||
- | |||
- | |||
===== Attribute cache ===== | ===== Attribute cache ===== | ||
+ | |||
For optimalization, | For optimalization, | ||
- | * The cache **key** is a mapped attribute and attributes from the end system. | ||
- | * The **value** is the transformed value from the system. | ||
- | <note important> | + | * The cache **key** |
- | <note warning> | + | * The **value** |
+ | |||
+ | <note important> | ||
==== Send additional attributes with password ==== | ==== Send additional attributes with password ==== | ||
- | It's possible to send additional attributes to provisioning, | + | It's possible to send additional attributes to provisioning, |
- send additional attributes together with new password in one provisioning operation | - send additional attributes together with new password in one provisioning operation | ||
- | - send additional attributes after password is changed in another provisioning operation | + | - send additional attributes after password is changed in another provisioning operation |
Two ways are be configurable by application configuration '' | Two ways are be configurable by application configuration '' | ||
- | * '' | ||
- | * '' | ||
+ | * '' | ||
+ | * '' | ||
<note tip> | <note tip> | ||
+ | === Send attribute only on password change === | ||
+ | |||
+ | Since version **11.0.0** | ||
+ | |||
+ | If is this flag checked, then the attribute will be send to the system only during change of password operation. It means that this attribute will be ignored in standard provisioning operations (create/ | ||
===== Linking a role ===== | ===== Linking a role ===== | ||
+ | |||
{{tag> | {{tag> | ||
- | In the previous paragraphs, we created a system which contains a scheme and mapped attributes for an identity and provisioning. | ||
- | In order to create an account for a specific user in the end system, we have to create a role which will be assigning this system and, at the same time, we have to assign this role to the user. | ||
- | |||
- | * We will create a new role **Table role**. | ||
- | * In the **Connected systems** tab, we will create a new connection to our system **Table** for the entity **Identity**. | ||
- | * We will assign this role to a user. We will do this in the user details in the **Assigned roles** tab. | ||
- | * After successfully assigning the valid role, a corresponding account in the system should be created. We can check this in the " | ||
- | * We can also check the account creation in the **Table** system. A link to the user account should have been created in the **System entities** tab. | ||
- | * **System identifier**, | ||
+ | In the previous paragraphs, we created a system which contains a scheme and mapped attributes for an identity and provisioning. In order to create an account for a specific user in the end system, we have to create a role which will be assigning this system and, at the same time, we have to assign this role to the user. | ||
+ | * We will create a new role **Table role**. | ||
+ | * In the **Connected systems** | ||
+ | * We will assign this role to a user. We will do this in the user details in the **Assigned roles** | ||
+ | * After successfully assigning the valid role, a corresponding account in the system should be created. We can check this in the " | ||
+ | * We can also check the account creation in the **Table** | ||
+ | * **System identifier**, | ||
===== Linking a role - attribute overload ===== | ===== Linking a role - attribute overload ===== | ||
In the previous chapter we explained how to assign a role tied to a system. By doing this, we created an account which corresponds precisely to the mapping in the system. That was a default mapping. However, if want to create a role which will affect only a specific attribute, we will need to adjust the behavior (mapping) of the attribute, i.e. we will need to overload the attribute mapping. | In the previous chapter we explained how to assign a role tied to a system. By doing this, we created an account which corresponds precisely to the mapping in the system. That was a default mapping. However, if want to create a role which will affect only a specific attribute, we will need to adjust the behavior (mapping) of the attribute, i.e. we will need to overload the attribute mapping. | ||
- | <note tip> We need to create a role where, after it has been assigned, the linked accounts will contain first name + the " | + | <note tip> We need to create a role where, after it has been assigned, the linked accounts will contain first name + the " |
* We will create a new role **Table role - first name**. | * We will create a new role **Table role - first name**. | ||
* Add the same system mapping as with the *Table role* role. | * Add the same system mapping as with the *Table role* role. | ||
- | * In the **Attributes mapped within this role** table, we will add a new attribute which will overload the default attribute **firstname**. | + | * In the **Attributes mapped within this role** |
- | * **Fill in the name** - for example " | + | * **Fill in the name** |
- | * Tick **Entity attribute**. | + | * Tick **Entity attribute**. |
- | * Fill in **firstName** as the **IdM key**. | + | * Fill in **firstName** |
- | * Insert " | + | * Insert " |
- | * Now, if the role is assigned to a user, the account on the end system **Table** will contain the **overloaded value** suffix in the **firstname** attribute. | + | * Now, if the role is assigned to a user, the account on the end system **Table** |
====== Mapped attribute strategy ====== | ====== Mapped attribute strategy ====== | ||
+ | |||
{{tag> | {{tag> | ||
Line 133: | Line 152: | ||
The default strategy which sends the acquired value to the end system as IdM calculates it. If the value is the same on the end system, the attribute isn't sent. | The default strategy which sends the acquired value to the end system as IdM calculates it. If the value is the same on the end system, the attribute isn't sent. | ||
- | This strategy is applied both to account **editing** and its **creation**. | + | This strategy is applied both to account **editing** |
==== WRITE-IF-NULL (Set only if the value on the system is null) ==== | ==== WRITE-IF-NULL (Set only if the value on the system is null) ==== | ||
- | The attribute value which is calculated by IdM is sent to the end system only if the end system value is calculated as equal to **null**. | + | The attribute value which is calculated by IdM is sent to the end system only if the end system value is calculated as equal to **null**. Before the final comparison whether the value is non-existent, |
- | Before the final comparison whether the value is non-existent, | + | |
- | This strategy is applied both to account **editing** and its **creation**. | + | This strategy is applied both to account **editing** |
- | <note note> | + | <note note> |
- | <note tip>The **WRITE-IF-NULL** strategy has a lower priority than **SET**, **MERGE** and **AUTHORITATIVE_MERGE**. Therefore, if we define one attribute with the **SET** strategy and another with the **WRITE-IF-NULL** strategy in the default mapping on the system, then the value of the **WRITE-IF-NULL** attribute will never be used. In this case, it will be necessary to define only the attribute with the **WRITE-IF-NULL** strategy in the default mapping. The other attribute with the **SET** strategy will have to be defined in the role as an overload of the default attribute.</ | + | <note tip>The **WRITE-IF-NULL** |
==== CREATE (Set only when creating) ==== | ==== CREATE (Set only when creating) ==== | ||
Line 150: | Line 168: | ||
The attribute value which is calculated by IdM is sent to the end system only when creating a new account on the end system. | The attribute value which is calculated by IdM is sent to the end system only when creating a new account on the end system. | ||
- | <note note> | + | <note note> |
- | The **CREATE** strategy has a lower priority than **WRITE-IF-NULL**, | + | The **CREATE** |
==== AUTHORITATIVE_MERGE (Authoritative merge) ==== | ==== AUTHORITATIVE_MERGE (Authoritative merge) ==== | ||
+ | |||
{{tag> | {{tag> | ||
Line 161: | Line 180: | ||
<note important> | <note important> | ||
- | The **MERGE** strategies are different, however. If there are more attributes overloading the same default attribute, all the values are merged into one. This resulting value (list) is sent to the IdM system as a " | + | The **MERGE** |
- | <note important> | + | <note important> |
With authoritative merge, the original values of the attribute on the end system are not taken into account (i.e. if some other system or administrator had put a different value to the attribute, it would be ignored by IdM). | With authoritative merge, the original values of the attribute on the end system are not taken into account (i.e. if some other system or administrator had put a different value to the attribute, it would be ignored by IdM). | ||
- | Therefore, in a situation where the resulting value of the merged attribute from **IdM** is **[A,B]** and the value of the same attribute on the end system is **[C,D]**, then the end system attribute will gain the value of **[A,B]** after provisioning. | + | Therefore, in a situation where the resulting value of the merged attribute from **IdM** |
==== MERGE (Merge) ==== | ==== MERGE (Merge) ==== | ||
- | {{tag> | ||
- | <note warning> | + | {{tag> |
+ | |||
+ | <note warning> | ||
This strategy follows the same pattern as authoritative merge up until the phase of creating a " | This strategy follows the same pattern as authoritative merge up until the phase of creating a " | ||
Line 178: | Line 198: | ||
A procedure different from authoritative merge occurs at the moment of provisioning. The goal is to ensure that the attribute on the end system can be shared by more systems (it means IdM is not authority for all values in the attribute). | A procedure different from authoritative merge occurs at the moment of provisioning. The goal is to ensure that the attribute on the end system can be shared by more systems (it means IdM is not authority for all values in the attribute). | ||
- | <note important> | + | <note important> |
- | Another goal is to ensure the correct **removing** of the managed values. | + | Another goal is to ensure the correct **removing** |
For identify what values are controlled by the IdM, we get it based on the settings of the roles mapping the system and overloaded this attribute (this ' | For identify what values are controlled by the IdM, we get it based on the settings of the roles mapping the system and overloaded this attribute (this ' | ||
- | <note tip>The **controlled values** are **currently valid** values (based on roles values) and values **valid in the past**. </ | + | <note tip>The **controlled values** |
The controlled values are currently valid values (based on roles values) and values valid in the past. Such a " | The controlled values are currently valid values (based on roles values) and values valid in the past. Such a " | ||
- | * **Change the script defining the controlled value**. For example, if we change the assigned value ' | + | * **Change the script defining the controlled value**. For example, if we change the assigned value ' |
- | * **By disabling the attribute** - if we disable the attribute assigning the value ' | + | |
- | * **Change the attribute strategy** - if we change the strategy from ' | + | |
- | {{ : | + | {{ .: |
- | Because the calculation of which values are currently controlled could be time expensive operation, are that values cached in entity **SysAttributeControlledValue** which is mapped on system mapping attribute. | + | Because the calculation of which values are currently controlled could be time expensive operation, are that values cached in entity **SysAttributeControlledValue** |
- | That persisted ' | + | |
- | The evicted cache is **recalculated** by using the **AttributeControlledValuesRecalculationTaskExecutor** task, which is run after each save of attribute mapping on a role. In this case, this task recalculates the cache for all evicted attributes of the provisioning mapping. | + | The evicted cache is **recalculated** |
- | {{ : | + | <note important> |
- | **Cache recalculation with this task can be started manually**. At this startup, you must specify the system | + | <note important> |
- | Second situation when is cache recalculated is during provisioning. If the attribute is still marked as evicted. | + | |
- | Therefore, in a situation where the resulting value of the merged attribute from **IdM** is **[A,B]** and the value of the same attribute on the end system is **[C,D]**, then the end system attribute will gain the value of **[A, | + | {{ |
- | Let us continue with the previous case, where the value **[A, | + | **Cache recalculation with this task can be started manually**. At this startup, you must specify the system identifier and entity type (the ' |
+ | |||
+ | Therefore, in a situation where the resulting value of the merged attribute from **IdM** | ||
+ | |||
+ | Let us continue with the previous case, where the value **[A, | ||
**In our case we have the following information at our disposal:** | **In our case we have the following information at our disposal:** | ||
Line 216: | Line 236: | ||
By comparing these values, we can deduce that we have to remove value **B**, so that the result is value **[A, | By comparing these values, we can deduce that we have to remove value **B**, so that the result is value **[A, | ||
- | An advantage of this approach is the ability of detecting **dynamic changes** as well. This means that if we don't remove the role which assigned value **B**, but instead we change the calculation definition of this value, so that the result is **X**, then it follows from the above mentioned that we are able to correctly identify that we want to send value **[A, | + | An advantage of this approach is the ability of detecting **dynamic changes** |
- | <note tip>**A simple way** of how to verify which attributes (values) were " | + | <note tip>**A simple way** of how to verify which attributes (values) were " |
<note important> | <note important> | ||
Line 226: | Line 246: | ||
{{tag> | {{tag> | ||
- | Since version **9.7.0** was added new feature enabling skip of value defined in merge attribute, if contract (on witch is role assigned) will be excluded. | + | Since version **9.7.0** |
For enable this feature you need to check the option **' | For enable this feature you need to check the option **' | ||
**Value will be skipped only if**: | **Value will be skipped only if**: | ||
- | | + | |
- | - Feature is **enabled** on the role mapping. | + | |
- | - Identity has assigned this role/s to the **excluded contract/ | + | - Feature is **enabled** |
+ | - Identity has assigned this role/s to the **excluded contract/ | ||
<note important> | <note important> | ||
- | {{ : | + | {{ .: |
==== Additional characteristics of strategies ==== | ==== Additional characteristics of strategies ==== | ||
- | Aside from a strategy, every attribute can also have the indications **Always send** and **Send only if IdM value exists**. These indications can be combined with all strategies. | + | Aside from a strategy, every attribute can also have the indications **Always send** |
+ | |||
+ | * **Always send** | ||
+ | * **Send only if IdM value exists** | ||
+ | ==== Mapping priority (since 14.7.0, 15.1.0) ==== | ||
+ | |||
+ | By default, during provisioning, | ||
+ | |||
+ | The solution to this need is the introduction of a ' | ||
+ | |||
+ | - A mapping with priority 0, which has both ' | ||
+ | - A mapping with priority 1, which is not limited to password changes. In the transformation script to the system, ' | ||
- | * **Always send** - Ensures that the attribute will be sent to the end system even when it has been assessed that its value hasn't changed. | ||
- | * **Send only if IdM value exists** - Ensures that the attribute will be sent only when the calculated IdM value has some value (if it is a String type value, it cannot be blank). This setting ensures that the IdM system doesn' | ||
- | |||
- | |