Downloads

Security and Audit

MDM has several security features:

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>
  1. Auditing — The audit element enables event auditing. Configure what gets logged and where.

  2. Writers — Where audit events are written to: server log (ServerLoggerAuditWriter) or a standalone file (LoggerAuditWriter).

  3. Event filters — Which events to audit (for example, AuditAll, BatchOpsAll, ServicesByName, ReadAll). Multiple filters can be combined.

  4. Authorization — Enables role-based authorization. Configure who is allowed to do what.

  5. Permissions — Each role contains a list of permissions (for example, ReadAll, WriteEntities, ServicesByName) that define what actions the role allows.

Event filters (under audit) and permissions (under authorization) share several class names (for example, BatchOpsByName, ServicesByName, ReadEntities). They serve different purposes: event filters control what gets logged, while permissions control what is allowed.

Both are configured in the same nme-security.xml file but in their respective sections.

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 (writers element).

  • What events should be audited (eventFilters element).

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.

Sample configuration
<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.

Sample configuration
<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.

Sample configuration
<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.

Sample configuration
<eventFilter class="com.ataccama.nme.engine.security.audit.filters.ReadMasterLayer">
  <masterViews>
    <view>invest</view>
  </masterViews>
</eventFilter>

ReadEntities

Provide a list of entities:

<eventFilter class="com.ataccama.nme.engine.security.audit.filters.ReadEntities">
  <entities>
    <entity name="address" layer="instance" />
    <entity name="party" layer="master" masterView="invest" />
  </entities>
</eventFilter>

WriteEntities

Provide a list of entities (both instance and master):

<eventFilter class="com.ataccama.nme.engine.security.audit.filters.WriteEntities">
  <entities>
    <entity name="address" layer="instance" />
    <entity name="party" layer="master" masterView="invest" />
  </entities>
</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, getTasks)

OPS_WRITE

A REST API endpoint that changes the MDM Server state was called, for example, purge.

operation (the OpenAPI operation ID, for example, purge)

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

ServicesAll, ServicesByName

Yes

No

Configured service names have no effect on the REST API.

OpsView, OpsWrite

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: GET /instance, /master, /master/{view}, /history, and the metadata endpoints

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: /statistics/instance and /statistics/master

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

MERGE_MASTER and REMATCH_MASTER also require write permission for the master entity, and SPLIT for the master entities of the split records.

Bulk delta imports

Write permission for the entity of every item and child record

Purge

OpsWrite

Reading source systems, system parameters, the operation plan, interface listings, persistence layers, system tasks, event handlers, stream consumers, and the statistics refresh state

OpsView

Terminating system tasks, changing the state of event handlers, starting and stopping stream consumers, managing indices, triggering LTC, and refreshing statistics

OpsWrite

Starting batch load and export operations

BatchOpsAll, or BatchOpsByName including the operation name

Task management (/api/rest/v2/tasks)

MDM Web App permissions, see MDM Web App Permissions

Not controlled by nme-security.xml.

Lookups management

Full access to the MDM Admin Center (MDM_admin by default), see MDM Server Application Properties > MDM Admin Center permissions

Not controlled by nme-security.xml.

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 OpsView.

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.

Sample configuration
<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.

Sample configuration
<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.

Sample configuration
<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.

Sample configuration
<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.

Sample configuration
<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.

Sample configuration
<!-- 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.

Basic configuration (backward compatible - instance entities only)
<permission class="com.ataccama.nme.engine.security.auth.permissions.WriteEntities">
  <entities>
    <entity name="address" />
    <entity name="party" />
  </entities>
</permission>
Extended configuration with both instance and master entities:
<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 <attribute_name>.

BOOLEAN

getParameterValue("security.role.<role_name>")

Returns whether the authenticated user has role <role_name>.

Was this page useful?