Synchronize Data Between MongoDB and IDM

This sample uses the Groovy Connector Toolkit to implement a scripted connector that interacts with a MongoDB database. You can use the connector to provision MongoDB database users and roles from an IDM managed repository.

The Groovy Connector Toolkit is bundled with IDM in the JAR openidm/connectors/groovy-connector-1.5.7.0.jar.

Sample Overview

The Groovy scripts required for the sample are bundled within the MongoDB connector. If you want to customize these scripts, you can specify different scripts by adjusting the scriptRoots property and script names in provisioner.openicf-mongodb.json.

This sample lets you to synchronize from IDM Managed User to an external MongoDB database.

Note

There is currently no way to synchronize passwords from an external MongoDB database to IDM. Because of this, it is recommended that IDM be used for user creation and password management.

While not demonstrated in this sample, the MongoDB connector can also:

  • Synchronize from a dedicated store of IDM Managed MongoDB Roles to an external MongoDB database.

  • Synchronize from an external MongoDB database to a dedicated IDM store of Managed MongoDB Roles.

Configure the MongoDB Database

This sample assumes a MongoDB database, running on the localhost system. Follow these steps to install and configure the MongoDB database:

  1. Use the instructions for downloading and installing MongoDB in the MongoDB Manual. For the supported version of MongoDB, see "MongoDB Connector".

  2. Set up MongoDB, based on the configurationProperties discussed in "MongoDB Connector". By default, it listens on localhost, port 27017. For the purpose of this sample, we'll set up an administrative user of myUserAdmin with a password of Passw0rd in the admin database. We will then create a database in MongoDB named hrdb.

    Note

    The MongoDB administrative user must have the userAdminAnyDatabase role, or attempts to update users will fail.

    If want to use an existing MongoDB instance that runs on a different host or port, or you want to change the database credentials, adjust the configurationProperties in the connector configuration file (samples/sync-with-mongodb/conf/provisioner.openicf-mongodb.json) before you start the sample, as described in "Configuring the MongoDB Connector".

  3. Set up the MongoDB database, with which IDM will synchronize its managed user repository, by:

Run the Sample

In this section, you will start IDM with the sample configuration, test the connection to the MongoDB database, and populate the database with sample data.

The mapping configuration file (sync.json) for this sample includes one mapping: managedUser_systemMongodbAccount. You will use this mapping to synchronize users between the IDM repository and the MongoDB database:

  1. Update samples/sync-with-mongodb/conf/provisioner.openicf-mongodb.json with the credentials and database information you created when configuring MongoDB. In our example, database would be set to hrdb, while user would be myUserAdmin with userDatabase set to admin.

  2. Start IDM with the configuration for the MongoDB sample:

    /path/to/openidm/startup.sh -p samples/sync-with-mongodb
  3. Create at least one assignment and role to assign roles to users. In this example, we are creating a role to assign read privileges to users. The role created is conditional, and only assigned to active users:

    curl \
    --header "X-OpenIDM-Username: openidm-admin" \
    --header "X-OpenIDM-Password: openidm-admin" \
    --header "Accept-API-Version: resource=1.0" \
    --header "Content-type: application/json" \
    --request POST \
    --data '{
       "name" : "MongoDB Read Access",
       "description": "Basic Read Access to HRDB",
       "mapping" : "managedUser_systemMongodbAccount",
       "attributes": [
         {
           "name": "roles",
           "value": [
             {
               "role": "read",
               "db": "hrdb"
             }
           ],
           "assignmentOperation" : "mergeWithTarget",
           "unassignmentOperation" : "removeFromTarget"
         }
       ]
     }' \
    "http://localhost:8080/openidm/managed/assignment?_action=create"
    {
      "_id": "fb98f4a5-0f4d-4e22-9e17-79c45c11fe20",
      "_rev": "000000005c2da0eb",
      "name": "MongoDB Read Access",
      "description": "Basic Read Access to HRDB",
      "mapping": "managedUser_systemMongodbAccount",
      "attributes": [
        {
          "name": "roles",
          "value": [
            {
              "role": "read",
              "db": "hrdb"
            }
          ],
          "assignmentOperation": "mergeWithTarget",
          "unassignmentOperation": "removeFromTarget"
        }
      ]
    }
    curl \
    --header "Content-type: application/json" \
    --header "X-OpenIDM-Username: openidm-admin" \
    --header "X-OpenIDM-Password: openidm-admin" \
    --header "Accept-API-Version: resource=1.0" \
    --request POST \
    --data '{
       "name" : "MongoDB Read Access",
       "description": "Role for accounts with read access in MongoDB.",
       "condition": "/accountStatus eq \"active\"",
       "assignments": [
         {
           "_ref": "managed/assignment/fb98f4a5-0f4d-4e22-9e17-79c45c11fe20",
           "_refResourceCollection": "managed/assignment",
           "_refResourceId": "fb98f4a5-0f4d-4e22-9e17-79c45c11fe20"
         }
       ]
     }' \
    "http://localhost:8080/openidm/managed/role?_action=create"
    {
      "_id": "5f16238e-39e1-4f8c-8b16-27d39dc64dc3",
      "_rev": "0000000011e566a2",
      "name": "MongoDB Read Access",
      "description": "Role for accounts with read access in MongoDB.",
      "condition": "/accountStatus eq \"active\""
    }
  4. Create new users in IDM. Note that MongoDB requires user name, password, and roles properties to successfully create a user. In this example, the read role is assigned to new users automatically.

  5. Reconcile the managed user repository with the external MongoDB database:

    • To reconcile the repository through the UI:

      1. Log in to the Admin UI at the URL https://localhost:8443/admin as the default administrative user (openidm-admin) with password openidm-admin.

      2. Select Configure > Mappings.

        The Mappings page shows one mapping: From the IDM Managed User repository to the MongoDB database (managedUser_systemMongodbAccount).

      3. Select the managedUser_systemMongodbAccount mapping, and choose the Reconcile option.

    • To reconcile the repository by using the command-line, launch the reconciliation operation with the following command:

      curl \
      --header "X-OpenIDM-Username: openidm-admin" \
      --header "X-OpenIDM-Password: openidm-admin" \
      --header "Accept-API-Version: resource=1.0" \
      --request POST \
      "http://localhost:8080/openidm/recon?_action=recon&mapping=managedUser_systemMongodbAccount&waitForCompletion=true"
      {
        "_id": "e5bf074e-4da6-4ea7-8203-d4ec6f5a814a-24344",
        "state": "SUCCESS"
      }

    The reconciliation operation creates MongoDB users from the users found in managed/user.

Read a different version of :