Security and Audit
MDM has several security features:
-
Auditing of events.
-
Authorization for executing operations and accessing data.
nme-security.xml
The nme-security.xml file configures auditing and authorization in the MDM Server.
It is usually stored in [MDM project]/etc/nme-security.xml and referenced in the MDM Configuration file (see MDM Configuration).
The file has two main sections — audit and authorization — both nested under the root <security> element.
The following example shows a realistic configuration with callout annotations pointing to the relevant sections of this page:
<?xml version='1.0' encoding='UTF-8'?>
<security>
<audit> (1)
<writers> (2)
<writer class="com.ataccama.nme.engine.security.audit.ServerLoggerAuditWriter">
<loggerName>NME-Auditing</loggerName>
</writer>
</writers>
<eventFilters> (3)
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.BatchOpsAll" />
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.ServicesByName">
<services>
<service>identifyParty</service>
</services>
</eventFilter>
</eventFilters>
</audit>
<authorization class="com.ataccama.nme.engine.security.auth.RoleBasedAuthorization"> (4)
<authorizeDataServices>true</authorizeDataServices>
<roles>
<role name="MDM_admin"> (5)
<permissions>
<permission class="com.ataccama.nme.engine.security.auth.permissions.ReadAll" />
<permission class="com.ataccama.nme.engine.security.auth.permissions.WriteAll" />
</permissions>
</role>
</roles>
</authorization>
</security>
-
Auditing — The
auditelement enables event auditing. Configure what gets logged and where. -
Writers — Where audit events are written to: server log (
ServerLoggerAuditWriter) or a standalone file (LoggerAuditWriter). -
Event filters — Which events to audit (for example,
AuditAll,BatchOpsAll,ServicesByName,ReadAll). Multiple filters can be combined. -
Authorization — Enables role-based authorization. Configure who is allowed to do what.
-
Permissions — Each role contains a list of permissions (for example,
ReadAll,WriteEntities,ServicesByName) that define what actions the role allows.
|
Event filters (under Both are configured in the same |
Auditing
You can configure the MDM Server to audit the following events:
-
Reading a record, through the REST API or the SOAP native services.
-
Writing (insert, update, delete) a record, through the REST API or the SOAP native services.
-
Calling the operational REST API endpoints.
-
Execution of batch operations.
-
Calling a SOAP native service.
Configuration of an audit consists of two parts:
-
Where the audit should be written to (
writerselement). -
What events should be audited (
eventFilterselement).
To enable auditing, add an audit element to the configuration with at least one audit writer.
Audit events consist of several attributes and are written as JSON:
{"TYPE":"CALL_SERVICE","DATE":"2015-01-19 12:37:52","USER":"jsmith","ATTRIBUTES":{"NAME":"listpartyInstances","GROUP":"Read services"}}
A full log line generated by the server looks as follows.
16.01.2018 20:23:32 [INFO] [NmeServerComponent][NME-Auditing][WRITE_RECORD] [18] {"DATE":"2015-01-19 12:37:52","USER":"jsmith","TYPE":"CALL_SERVICE","ATTRIBUTES":{"NAME":"listpartyInstances","GROUP":"Read services"}}
Where:
-
[NmeServerComponent]- The parent log trace, indicating it comes from the Server Component. -
[NME-Auditing]- The logger as configured in the writers. -
[WRITE_RECORD]- Event type. -
[18]- MDM Server task ID. -
{JSON}- Event details.
Writers
ServerLoggerAuditWriter
This writer writes audit events using the Logging Configuration of the MDM Server (see Logging Configuration). You can set the name of the logger.
<writer class="com.ataccama.nme.engine.security.audit.ServerLoggerAuditWriter">
<loggerName>NME Auditing</loggerName> <!-- default name is "Audit" -->
</writer>
LoggerAuditWriter
This writer writes audit events using standalone configuration and a logging engine not connected to the MDM Server logging. You must provide the name of the configuration file.
<writer class="com.ataccama.nme.engine.security.audit.LoggerAuditWriter">
<loggerConfig>nme-audit-logging.xml</loggerConfig>
</writer>
The following is an example of the nme-audit-logging.xml configuration file:
nme-audit-logging.xml file
<?xml version="1.0" encoding="UTF-8"?>
<loggingConfig class="com.ataccama.dqc.commons.logging.config.LoggingConfigImpl">
<appenders>
<iLogAppenderFactory class="com.ataccama.dqc.commons.logging.factories.StdOutLogAppenderFactory" name="stdout" useStdErr="false"/>
<iLogAppenderFactory class="com.ataccama.dqc.commons.logging.factories.JDKHandledLogAppenderFactory" name="rotate">
<handler class="com.ataccama.dqc.commons.logging.handlers.FileHandlerInfo">
<pattern>mdm-audit%g.log</pattern>
<limit>100000</limit>
<count>4</count>
<append>true</append>
<formatter class="com.ataccama.dqc.commons.logging.handlers.SimpleFormatterInfo"/>
</handler>
</iLogAppenderFactory>
</appenders>
<loggingRules>
<!-- the rules for each possible nme audit events -->
<loggingRule appender="rotate" level="INFO">
<trace>
<item>RUN_BATCH</item>
</trace>
</loggingRule>
<loggingRule appender="rotate" level="INFO">
<trace>
<item>READ_TYPE</item>
</trace>
</loggingRule>
<loggingRule appender="rotate" level="INFO">
<trace>
<item>READ_RECORD</item>
</trace>
</loggingRule>
<loggingRule appender="rotate" level="INFO">
<trace>
<item>WRITE_TYPE</item>
</trace>
</loggingRule>
<loggingRule appender="rotate" level="INFO">
<trace>
<item>WRITE_RECORD</item>
</trace>
</loggingRule>
<loggingRule appender="rotate" level="INFO">
<trace>
<item>UNAUTHORIZED</item>
</trace>
</loggingRule>
<loggingRule appender="rotate" level="INFO">
<trace>
<item>OPS_VIEW</item>
</trace>
</loggingRule>
<loggingRule appender="rotate" level="INFO">
<trace>
<item>OPS_WRITE</item>
</trace>
</loggingRule>
<loggingRule appender="rotate" level="INFO">
<trace>
<item>CALL_SERVICE</item>
</trace>
</loggingRule>
</loggingRules>
</loggingConfig>
Event filters
Event filters configure what events are audited.
Every event filter adds auditing of some kind of events.
If you omit the eventFilters element or configure no event filters, the AuditDefault event filter is used.
Event filter evaluation order
When multiple event filters are configured, they are evaluated in the order they appear in the XML. For each event, the first filter that matches triggers the audit — no subsequent filters are checked for that event. If no filter matches, the event is not audited.
For example, if AuditAll is listed first, it matches every event and all subsequent filters are effectively ignored.
Order your filters from most specific to least specific to achieve fine-grained control.
|
In high traffic environments, auditing every event might consume enormous amount of disk space. For example, one call to a native service providing 100 records leads to 101 audited events. Average size of an audited event is 200 bytes. In an environment with 100k calls a day, every day audit logs will take approximately 2GB of disk space. |
Example configuration of event filters:
...
<eventFilters>
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.BatchOpsAll" />
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.ServicesByName">
<services>
<service>identifyParty</service>
</services>
</eventFilter>
</eventFilters>
...
The following table lists all available event filters.
| Event filter class | Description | Additional configuration |
|---|---|---|
AuditAll |
All events are audited. |
|
AuditDefault |
Default event filter if an audit is enabled but no event filters are configured. |
|
BatchOpsAll |
All executions of batch operations (load, export) are audited at the moment of request for execution is received. |
|
BatchOpsByName |
Executions of configured batch operations (load, export) are audited at the moment when a request for execution is received. |
A list of batch operation names. Names are evaluated as regular expressions. |
ServicesAll |
All calls of native services are audited. One call is one audit event. |
|
ServicesByName |
Calls of configured native services are audited. One call is one audit event. |
A list of native service names. Names are evaluated as regular expressions. |
ReadAll |
All reads of data through the REST API or the native services (getById, list, search, traversal, identify) are audited. Read of one record is one audit event. |
|
ReadInstanceLayer |
All reads of instance records are audited. Read of one record is one audit event. |
Optionally, a list of source systems. |
ReadMasterLayer |
All reads of master records are audited. Read of one record is one audit event. |
Optionally, a list of master views. |
ReadEntities |
All reads of records in configured entities are audited. Read of one record is one audit event. |
A list of entities. |
WriteAll |
All writes through the REST API or the native services are audited. One record on input is one audit event. |
|
WriteEntities |
Writes of records in configured entities are audited. One record on input is one audit event. |
A list of entities (both instance and master). |
OpsView |
Calls to the REST API endpoints that read the MDM Server state are audited as OPS_VIEW events. One call is one audit event. |
|
OpsWrite |
Calls to the REST API endpoints that change the MDM Server state are audited as OPS_WRITE events. One call is one audit event. |
Requests refused for a missing permission are audited as UNAUTHORIZED events regardless of the event filters.
Calls to the operational REST API endpoints appear in the audit log only if an event filter captures them (AuditAll, AuditDefault for writes, or OpsView and OpsWrite) and nme-audit-logging.xml contains a logging rule for the OPS_VIEW or OPS_WRITE event type.
For example, to audit changes:
<!-- nme-security.xml, inside <eventFilters> -->
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.OpsWrite" />
<!-- nme-audit-logging.xml, inside <loggingRules> -->
<loggingRule appender="rotate" level="INFO">
<trace><item>OPS_WRITE</item></trace>
</loggingRule>
Several event filters have additional parameters or specific behavior. Those are explained in the following sections.
AuditDefault
This default event filter audits all executions of batch operations and calls to native services belonging to the Special services or Write services groups.
BatchOpsByName
Provide a list of regular expressions that are evaluated against all configured batch operations. Execution of all matched batch operations is audited.
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.BatchOpsByName">
<batchOperations>
<op>.+_load</op>
<op>.*reprocess.*</op>
<op>crm_export</op>
</batchOperations>
</eventFilter>
ServicesByName
Provide a list of regular expressions that are evaluated against all configured native services. A call of any matched native service is audited.
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.ServicesByName">
<services>
<service>get.+ById</service>
<service>invoke.*</service>
</services>
</eventFilter>
ReadInstanceLayer
You can provide a list of source systems, so that only reads of instance records from those systems are audited. Otherwise, all reads of instance records are audited.
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.ReadInstanceLayer">
<sourceSystems>
<system>crm</system>
</sourceSystems>
</eventFilter>
ReadMasterLayer
You can provide a list of master views, so that only reads of master records from those views are audited. Otherwise, all reads of master records are audited.
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.ReadMasterLayer">
<masterViews>
<view>invest</view>
</masterViews>
</eventFilter>
Audited events overview
The following table lists details of all possible audit events. Every audit event contains its type, username, and timestamp.
| Event type or code | Description | Additional attributes |
|---|---|---|
RUN_BATCH |
A batch operation was requested. |
operation type, operation type ID, operation name, source of operation (workflow, service, command line, web console), source additional attributes (name of workflow, ID of workflow instance, name of service, remote address) |
CALL_SERVICE |
A native service was called. |
service name, service group |
READ_RECORD |
A record was read through the REST API or the native services. |
record ID, record source ID (instance records only), record type, record layer, record masterView (master records only) |
WRITE_RECORD |
A request to write a record was sent. If no action is taken (for example, delete of a non-existing record), an event is audited anyway. |
record ID, record source ID (instance records only), record type, record source system, record origin, record change type |
UNAUTHORIZED |
An unauthorized attempt was made. Requests refused for a missing permission are audited regardless of the event filters. |
unauthorized event (of type RUN_BATCH, CALL_SERVICE, READ_TYPE, WRITE_TYPE, WRITE_RECORD, OPS_VIEW, or OPS_WRITE) |
READ_TYPE |
A request to read records of an entity was sent without read permission. Used only as an unauthorized event inside an event of type UNAUTHORIZED. |
record type |
WRITE_TYPE |
A request to write records of an entity was sent without write permission. Used only as an unauthorized event inside an event of type UNAUTHORIZED. |
record type |
OPS_VIEW |
A REST API endpoint that reads the MDM Server state was called. |
operation (the OpenAPI operation ID, for example, |
OPS_WRITE |
A REST API endpoint that changes the MDM Server state was called, for example, purge. |
operation (the OpenAPI operation ID, for example, |
Additional attributes
Some additional audit parameters can be configured.
<audit>
...
<additionalAttributes>
<a class="">
...
</a>
</additionalAttributes>
...
</audit>
Including HTTP headers in audit events
To include HTTP headers in the audit events, add the following configuration. List all the headers that should be included into the audit event.
<audit>
...
<additionalAttributes>
<a class="com.ataccama.nme.engine.security.audit.HttpHeaders">
<headers>
<header name="Host" /> <!-- name of header -->
<header name="custom" />
</headers>
</a>
</additionalAttributes>
</audit>
The ATTRIBUTES part of the audit event JSON output will be enhanced with the HTTP_HEADERS:
{
...
"ATTRIBUTES":{
...
"HTTP_HEADERS":{
"Host":"localhost:8888",
"custom":"customvalue"
}
}
}
Audit event examples
Run batch operation
{
"TYPE":"RUN_BATCH",
"DATE":"2015-01-19 15:14:33",
"USER":"jsmith",
"ATTRIBUTES":{
"TYPE":"BATCH_LOAD",
"TYPEID":"batchLoad.crm_full",
"NAME":"Batch load \"crm_full\"",
"TASK_SOURCE":"service_call",
"TASK_SOURCE_ATTRIBUTES":{
"SERVICE_NAME":"invokeLoadOperation"
}
}
}
Call service
{
"USER":"jsmith",
"TYPE":"CALL_SERVICE",
"DATE":"2015-01-19 12:37:52",
"ATTRIBUTES":{
"NAME":"listpartyInstances",
"GROUP":"Read services"
}
}
Read record
{
"TYPE":"READ_RECORD",
"DATE":"2015-01-19 12:37:52",
"USER":"jsmith",
"ATTRIBUTES":{
"LAYER":"instance",
"ENTITY":"party",
"ID":"1218"
}
}
Write record
{
"TYPE":"WRITE_RECORD",
"DATE":"2015-01-19 15:20:12",
"USER":"jsmith",
"ATTRIBUTES":{
"ID":"1303209",
"SOURCE_ID":"1",
"ENTITY":"party",
"SOURCE_SYSTEM":"crm",
"ORIGIN":"crm#customer#party",
"CHANGE_TYPE":"NONE"
}
}
Authorization
You can configure the MDM Server to require authorization for the following actions:
-
Reading a record, through the REST API or the SOAP native services.
-
Writing (insert, update, delete) a record, through the REST API or the SOAP native services.
-
Calling the operational REST API endpoints.
-
Execution of batch operations.
-
Calling a SOAP native service.
The read and write permissions and AllPermissions apply to both APIs.
The following permissions are API-specific:
| Permission class | SOAP native services | REST API | Note |
|---|---|---|---|
|
Yes |
No |
Configured service names have no effect on the REST API. |
|
No |
Yes |
Required for the operational REST API endpoints (see REST API > Permissions). |
Access to the REST API endpoints themselves additionally requires a dedicated user role, see REST API access.
Authentication (getting user identity and their roles and attributes) is configured in the MDM Server application.properties file.
You can enable authorization by adding the authorization element to the security configuration.
Authorization is role-based: you define roles and assign permissions to them.
<?xml version='1.0' encoding='UTF-8'?>
<security>
...
<authorization class="com.ataccama.nme.engine.security.auth.RoleBasedAuthorization">
<!-- Optional configuration, default is false -->
<authorizeDataServices>true</authorizeDataServices>
<roles>
<role name="esb">
<permissions>
<permission class="com.ataccama.nme.engine.security.auth.permissions.ServicesAll" />
...
</permissions>
</role>
</roles>
</authorization>
</security>
REST API access
In addition to the permissions described on this page, calling the REST API requires the MDM_rest_api_access or MDM_admin user role.
See also REST API > Authentication and authorization.
Permissions required by REST API endpoints
The following table lists the nme-security.xml permission each group of REST API endpoints requires.
For the endpoints themselves, see REST API.
| Endpoints | Required permission | Notes |
|---|---|---|
Entity listings and metadata: |
Read permission for the entity |
Listings include only the entities you can read. Without any read permission, they are empty. |
Record reads: GET requests for instance and master records, search, traverse, and history |
Read permission for the entity |
The columns and records you receive are limited by the permission. |
Identify and identify in mixed style |
Read permission for the master entity |
The returned proposals are limited by the record conditions of the permission. |
Cleanse |
Read permission for the instance entity |
|
Statistics: |
None |
The counts include only the entities you can read. |
Record writes: POST, PUT, PATCH, and DELETE requests for instance and master records, activation and deactivation |
Write permission for the entity of every record in the request, including child records |
Deleting or merging an authored master record also requires write permission for its child master entities and the corresponding instance entity. |
Attribute overrides |
Read permission for GET requests, write permission for PUT and DELETE requests |
With a read permission limited to certain columns, you see only those columns and cannot override the others. |
Manual match |
Write permission for the instance entity |
|
Bulk delta imports |
Write permission for the entity of every item and child record |
|
Purge |
|
|
Reading source systems, system parameters, the operation plan, interface listings, persistence layers, system tasks, event handlers, stream consumers, and the statistics refresh state |
|
|
Terminating system tasks, changing the state of event handlers, starting and stopping stream consumers, managing indices, triggering LTC, and refreshing statistics |
|
|
Starting batch load and export operations |
|
|
Task management ( |
MDM Web App permissions, see MDM Web App Permissions |
Not controlled by |
Lookups management |
Full access to the MDM Admin Center ( |
Not controlled by |
Role-based authorization
For SOAP native services, record reads and writes go through a service, so a user would need permission both to access the data and to call the service. For example, to read a party record, a user would need permission to read the party and to call the listParty native service.
To avoid this double requirement, calls to the data services (getById, list, search, traversal, identify) are not authorized by default; only the data permission is checked.
To authorize the service calls as well, add authorizeDataServices and set it to true as shown in the previous code example.
This setting does not affect the REST API, where only the permissions apply.
Permissions
By combining several permissions you can create roles.
The following table lists all available permissions:
| Permission class | Description | Additional configuration |
|---|---|---|
AllPermissions |
Grants all permissions. |
|
BatchOpsAll |
Grants permission to execute all batch operations (load, export). |
|
BatchOpsByName |
Grants permission to execute configured batch operations. |
A list of batch operation names. Names are evaluated as regular expressions. |
ServicesAll |
Grants permission to call all SOAP native services. |
|
ServicesByName |
Grants permission to call configured SOAP native services. |
A list of native service names. Names are evaluated as regular expressions. |
OpsView |
Grants read access to the REST API endpoints that manage the MDM Server: source systems, system tasks, event handlers, interface listings, stream consumers, persistence, statistics refresh, runtime parameters, and the operation plan. Applies to the REST API only. |
|
OpsWrite |
Grants access to the REST API endpoints that change the MDM Server state: purge, terminating tasks, changing the state of event handlers, starting and stopping stream consumers, index management, LTC triggering, and statistics refresh. Applies to the REST API only and does not include |
|
ReadAll |
Grants permission to read all records. |
|
ReadInstanceLayer |
Grants permission to read all instance records. |
Optional, a list of source systems. |
ReadMasterLayer |
Grants permission to read all master records. |
Optional, a list of master views. |
ReadEntities |
Grants permission to read records of configured entities. |
A list of entities. An entity can optionally contain a list of columns and record conditions. |
WriteAll |
Grants permission to write any record. |
|
WriteInstanceLayer |
Grants permission to write all instance records. |
|
WriteMasterLayer |
Grants permission to write all master records. |
Optional, a list of master views. |
WriteEntities |
Grants permission to write records in configured entities (both instance and master). |
A list of entities. An entity can optionally contain a list of source systems and record conditions (for instance entities) or layer and masterView specification. |
Several permissions have additional parameters. Those are explained in the following sections.
The read permissions (ReadAll, ReadInstanceLayer, ReadMasterLayer, and ReadEntities) apply to reading data through the REST API or the native services (getById, list, search, traversal, and identify, where they filter the output; internal identification ignores permissions to get the correct result).
The write permissions (WriteAll, WriteInstanceLayer, WriteMasterLayer, and WriteEntities) apply to writing data through the REST API or the native services.
Multiple roles
When a user has multiple roles, their permissions are combined additively — the user receives the widest access granted by any of their roles:
-
If any role grants full access to an entity, the user has full access regardless of other roles.
-
For read permissions with column restrictions, visible columns are the union across all roles.
-
For read permissions with row-level conditions, the conditions are combined with OR — a record visible through any role is visible to the user.
-
For write permissions with restrictions, access is granted if any role’s restrictions allow the write.
BatchOpsByName
Provide a list of regular expressions that are evaluated against all configured batch operations. Permission to execute all matched batch operations is granted.
<permission class="com.ataccama.nme.engine.security.auth.permissions.BatchOpsByName">
<batchOperations>
<op>crm_load</op>
<op>.*_export</op>
</batchOperations>
</permission>
ServicesByName
Provide a list of regular expressions that are evaluated against all configured native services. Permission to call all matched native services is granted.
<permission class="com.ataccama.nme.engine.security.auth.permissions.ServicesByName">
<services>
<service>get.+ById</service>
<service>identify.*</service>
</services>
</permission>
ReadInstanceLayer
You can provide a list of source systems that the role has permission to read from. Otherwise, the role is granted permission to read all instance records.
<permission class="com.ataccama.nme.engine.security.auth.permissions.ReadInstanceLayer">
<sourceSystems>
<system>crm</system>
</sourceSystems>
</permission>
ReadMasterLayer
You can provide a list of master views, so that the role has permission to read master records only from those views. Otherwise, the role is granted permission to read all master records.
<permission class="com.ataccama.nme.engine.security.auth.permissions.ReadMasterLayer">
<masterViews>
<view>invest</view>
</masterViews>
</permission>
ReadEntities
Provide a list of entities:
<permission class="com.ataccama.nme.engine.security.auth.permissions.ReadEntities">
<entities>
<entity name="address" layer="instance" />
<entity name="party" layer="master" masterView="invest" />
</entities>
</permission>
Optionally, the entity element can contain a list of columns and conditions.
If there is at least one column, only the configured columns are visible to the caller. If there are conditions specified, only the records passing all conditions are visible to the caller (that is, multiple conditions are combined by the AND operator).
A condition’s column can be any column defined in the model configuration and several internal engine columns (eng_system for instance entities and eng_active for all entities).
An access attempt to invisible columns and records is silent. However, an access attempt to records of an entity the user cannot view at all is considered unauthorized and is logged according to the configuration.
...
<entity name="address" layer="instance">
<columns>
<!-- only columns listed below are visible -->
<column>src_city</column>
<column>src_state</column>
</columns>
<conditions>
<condition column="std_type" value="HOME" />
<!-- more conditions, combined by logical AND -->
</conditions>
</entity>
...
WriteInstanceLayer
Grants permission to write all instance records across all entities and source systems.
<permission class="com.ataccama.nme.engine.security.auth.permissions.WriteInstanceLayer" />
WriteMasterLayer
Grants permission to write all master records.
You can optionally provide a list of master views to limit the permission to specific views. Otherwise, the role is granted permission to write to all master records.
<!-- Permission to write all master records -->
<permission class="com.ataccama.nme.engine.security.auth.permissions.WriteMasterLayer" />
<!-- Permission to write master records only in specific views -->
<permission class="com.ataccama.nme.engine.security.auth.permissions.WriteMasterLayer">
<masterViews>
<view>master</view>
<view>master_restricted</view>
</masterViews>
</permission>
WriteEntities
You can provide a list of entities, which can now include both instance and master entities. For backward compatibility, when no layer is specified, the entity is treated as an instance entity.
<permission class="com.ataccama.nme.engine.security.auth.permissions.WriteEntities">
<entities>
<entity name="address" />
<entity name="party" />
</entities>
</permission>
<permission class="com.ataccama.nme.engine.security.auth.permissions.WriteEntities">
<entities>
<entity name="contact" layer="instance" />
<entity name="party" layer="master" masterView="master_restricted" />
</entities>
</permission>
Optionally, the entity element can contain a list of conditions and sourceSystems (for instance entities).
If conditions are defined, only the records passing all conditions can be written by the caller (that is, multiple conditions are combined by the AND operator).
The caller can write records to any of the source systems specified (that is, sourceSystems are combined by the OR operator).
An attempt to write a record not passing the configured conditions and allowed source systems is considered an unauthorized attempt and is logged according to the configuration.
If a WriteEntities permission lists specific entities, it must also include the entities that an operation changes indirectly: the child master entities and the corresponding instance entity when the role deletes or merges an authored master record, and the dependent entities of a processDelta service the role calls (see Read-write Services > Change detection).
Otherwise, the operation is refused even if the request contains no records of these entities.
You can restrict the added entities with sourceSystems and conditions as usual.
| On update, conditions are checked against both the old and new values of the record. This prevents a user from modifying a record so that it leaves the permission scope (for example, changing a column value that matched the condition to one that does not). |
...
<entity name="address" layer="instance">
<conditions>
<condition column="std_type" value="HOME" />
<!-- more conditions, combined by logical AND -->
</conditions>
<sourceSystems>
<system>crm</system>
<!-- more source systems, combined by logical OR -->
</sourceSystems>
</entity>
...
Data audit trail
In some cases you might want to identify the user who initiated the MDM consolidation process inside transition plans (cleanse, match, merge) or identify the user who initiated a batch export inside an export plan. The feature is not available in load plans.
You can access it by using the getParameterValue() function in a ONE expression.
| Return type | Expression | Description |
|---|---|---|
STRING |
getParameterValue("security.user") |
Returns the username. |
STRING |
getParameterValue("security.user.<attribute_name>") |
Returns the value of attribute |
BOOLEAN |
getParameterValue("security.role.<role_name>") |
Returns whether the authenticated user has role |
Was this page useful?