{
    "componentChunkName": "component---src-templates-docs-js",
    "path": "/admin/5-lifecycle/5-recon-groovy",
    "result": {"data":{"site":{"siteMetadata":{"title":"OpenIAM Documentation v2026.2.1 | OpenIAM","docsLocation":""}},"mdx":{"fields":{"id":"0903c34f-6cba-5af6-824a-bee3971e10a6","title":"Groovy Scripts for Reconciliation","slug":"/admin/5-lifecycle/5-recon-groovy"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Groovy Scripts for Reconciliation\",\n  \"metaTitle\": \"Groovy Scripts for Reconciliation\",\n  \"metaDescription\": \"This section provides useful Groovy Scripts for reconciliation and data on developing them\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This section provides the overview of how to use Groovy Scripts for Reconciliation. There are examples of things that the user can do via these scripts. This information might come in handy with creating user's own script.\"), mdx(\"h1\", null, \"Developing a Script\"), mdx(\"p\", null, \"There are 4 different Groovy scripts for each reconciliation case:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"IDM (deleted) and Resource (exists)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"IDM (exists) and Resource (exists)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"IDM (exists) and Resource (not exists)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"IDM (not exists) and Resource (exists)\")), mdx(\"p\", null, \"Each Groovy script implements PopulationScript.java (we advise to extend AbstractPopulationScript) interface with the only method:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"public int execute(Map<String, String> line, ProvisionUser pUser);\\n\")), mdx(\"p\", null, \"Each record (User) from the target system is represented by the Map of attribute names - value pairs.\"), mdx(\"p\", null, \"The second parameter in the execute function is provUser which we need to fill in with values from the Map. If the User already exists in OpenIAM, it will be pre-filled with values from OpenIAM database. So we can always compare old values with the new ones.\"), mdx(\"p\", null, \"Here is the example from the PopulationScript:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"public int execute(Map<String, String> line, ProvisionUser pUser) {\\n \\n        for(String key: line.keySet()) {\\n            switch(key) {\\n                case \\\"EmployeeID\\\":\\n                        pUser.employeeId = line.get(\\\"EmployeeID\\\")\\n                    break\\n                case \\\"employeeType\\\":\\n                        pUser.employeeType = line.get(\\\"employeeType\\\")\\n                    break\\n       ....\\n        }\\n \\n       return 0\\n}\\n\")), mdx(\"p\", null, \"From the AbstractPopulationScript we have access to Spring applicationContext and managedSysId.\"), mdx(\"p\", null, \"All groovy scripts have the \\\"ApplicationContext context\\\" field. And the best practice to initialize Services via ApplicationContext is via spring beans instead webservice communication through network. Read more in Initializing Services via ApplicationContext.\"), mdx(\"p\", null, \"We need to provide a valid provisionUser after reconciliation of each record and return \\\"0\\\" if everything is OK.\"), mdx(\"p\", null, \"Once provUser has been passed to provisioningService, the User is created/updated with the new values from the target system. If we need to change or add items to the provUser collections, we have to set up correct operation properties for items.\"), mdx(\"p\", null, \"For example, here is a snippet that adds a custom attribute to User:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"def addAttribute(ProvisionUser pUser, String attributeName, String attributeValue) {\\n        def userAttr = new UserAttribute(attributeName, attributeValue)\\n         if (!pUser.userAttributes.containsKey(attributeName)) {\\n            userAttr.operation = AttributeOperationEnum.ADD\\n        } else {\\n            if (userAttr.value != attributeValue) {\\n                userAttr.operation = AttributeOperationEnum.REPLACE\\n             }\\n        }\\n        pUser.userAttributes.put(attributeName, userAttr)\\n    }\\n\")), mdx(\"p\", null, \"We add an attribute to the userAttributes collection but before we set up operation - AttributeOperationEnum.ADD/REPLACE/DELETE.\\nIf we don't specify an operation for item, no changes will be applied.\"), mdx(\"h1\", null, \"Scripts Examples\"), mdx(\"h3\", null, \"Population sciprts for AD Powershell.\"), mdx(\"p\", null, \"The population script is used for creating a new user or editing the existing user's attributes received from the target system.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"import org.openiam.base.AttributeOperationEnum\\nimport org.openiam.idm.srvc.auth.dto.Login\\nimport org.openiam.idm.srvc.continfo.dto.Address\\nimport org.openiam.idm.srvc.mngsys.domain.ManagedSysEntity\\nimport org.openiam.idm.srvc.mngsys.service.ManagedSystemService\\nimport org.openiam.idm.srvc.res.service.ResourceService\\nimport org.openiam.provision.dto.ProvisionUser\\nimport org.openiam.idm.srvc.user.dto.UserStatusEnum\\nimport org.openiam.idm.srvc.user.dto.UserAttribute\\n\\nimport java.text.SimpleDateFormat\\n\\npublic class ADPopulationScript extends org.openiam.idm.srvc.recon.service.AbstractPopulationScript {\\n\\n    def dateFormat = new SimpleDateFormat(\\\"yyyy-MM-dd\\\")\\n\\n    public int execute(Map<String, String> line, ProvisionUser pUser) {\\n        int retval = 1\\n        for(String key: line.keySet()) {\\n            switch(key) {\\n                case \\\"SamAccountName\\\":\\n                    addAttribute(pUser, \\\"sAMAccountName\\\", line.get(\\\"SamAccountName\\\"))\\n                    break\\n                case \\\"EmployeeID\\\":\\n                    if(pUser.employeeId != line.get(\\\"EmployeeID\\\")){\\n                        pUser.employeeId = line.get(\\\"EmployeeID\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"employeeID\\\", line.get(\\\"EmployeeID\\\"))\\n                    break\\n                case \\\"employeeType\\\":\\n                    if(pUser.employeeType != line.get(\\\"employeeType\\\")){\\n                        pUser.employeeType = line.get(\\\"employeeType\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"employeeType\\\", line.get(\\\"employeeType\\\"))\\n                    break\\n                case \\\"GivenName\\\":\\n                    if(pUser.firstName != line.get(\\\"GivenName\\\")){\\n                        pUser.firstName = line.get(\\\"GivenName\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"givenName\\\", line.get(\\\"GivenName\\\"))\\n                    break\\n                case \\\"Surname\\\":\\n                    if(pUser.lastName != line.get(\\\"Surname\\\")){\\n                        pUser.lastName = line.get(\\\"Surname\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"sn\\\", line.get(\\\"Surname\\\"))\\n                    break\\n                case \\\"Initials\\\":\\n                    if(pUser.middleInit != line.get(\\\"Initials\\\")){\\n                        pUser.middleInit = line.get(\\\"Initials\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"initials\\\", line.get(\\\"Initials\\\"))\\n                    break\\n                case \\\"OtherName\\\":\\n                    if(pUser.nickname != line.get(\\\"OtherName\\\")){\\n                        pUser.nickname = line.get(\\\"OtherName\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"otherName\\\", line.get(\\\"OtherName\\\"))\\n                    break\\n                case \\\"AccountExpires\\\":\\n                    //TODO: What's the date format?\\n                    /*\\n                    if(line.get(\\\"AccountExpires\\\") && pUser.lastDate != line.get(\\\"AccountExpires\\\")) {\\n                        pUser.lastDate = new Date(line.get(\\\"AccountExpires\\\") as Long)\\n                        retval = 0\\n                    }\\n                    */\\n                    addAttribute(pUser, \\\"accountExpires\\\", line.get(\\\"AccountExpires\\\"))\\n                    break\\n                case \\\"City\\\":\\n                    if (insertPrimaryAddressItem(pUser, 'city', line.get(\\\"City\\\"))) {\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"l\\\", line.get(\\\"City\\\"))\\n                    break\\n                case \\\"State\\\":\\n                    if (insertPrimaryAddressItem(pUser, 'state', line.get(\\\"State\\\"))) {\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"st\\\", line.get(\\\"State\\\"))\\n                    break\\n                case \\\"HomeDirectory\\\":\\n                    addAttribute(pUser, \\\"homeDirectory\\\", line.get(\\\"HomeDirectory\\\"))\\n                    break\\n                case \\\"homeDrive\\\":\\n                    addAttribute(pUser, \\\"homeDrive\\\", line.get(\\\"homeDrive\\\"))\\n                    break\\n                case \\\"UserPrincipalName\\\":\\n                    addAttribute(pUser, \\\"userPrincipalName\\\", line.get(\\\"UserPrincipalName\\\"))\\n                    break\\n                case \\\"DistinguishedName\\\":\\n                    addAttribute(pUser, \\\"distinguishedName\\\", line.get(\\\"DistinguishedName\\\"))\\n                    break\\n                case \\\"ObjectGUID\\\":\\n                    addAttribute(pUser, \\\"objectGUID\\\", line.get(\\\"ObjectGUID\\\"))\\n                    break\\n                case \\\"extensionAttribute1\\\":\\n                    addAttribute(pUser, \\\"extensionAttribute1\\\", line.get(\\\"extensionAttribute1\\\"))\\n                    break\\n                case \\\"extensionAttribute2\\\":\\n                    addAttribute(pUser, \\\"extensionAttribute2\\\", line.get(\\\"extensionAttribute2\\\"))\\n                    break\\n                case \\\"Manager\\\":\\n                    //TODO: Add supervisor\\n                    addAttribute(pUser, \\\"manager\\\", line.get(\\\"Manager\\\"))\\n                    break\\n            }\\n        }\\n\\n        def managedSystemService = context.getBean(ManagedSystemService.class)\\n        def resourceService = context.getBean(ResourceService.class)\\n        def currentManagedSys = managedSystemService.getManagedSysById(managedSysId)\\n        def currentResource = resourceService.getResourceDTO(currentManagedSys.resourceId)\\n        if (!pUser?.resources?.find { it.resourceId == currentResource.resourceId }) {\\n            currentResource.operation = AttributeOperationEnum.ADD\\n            pUser.resources.add(currentResource)\\n        }\\n        //set status to active: IMPORTANT!!!!\\n        if (!pUser.status) {\\n            pUser.status = UserStatusEnum.PENDING_INITIAL_LOGIN\\n        }\\n        if (!pUser.metadataTypeId) {\\n            pUser.metadataTypeId = \\\"Contractor\\\"\\n        }\\n        //addExchangePrincipal(pUser, currentManagedSys, managedSystemService)\\n        return retval\\n    }\\n\\n    def addExchangePrincipal(ProvisionUser pUser, ManagedSysEntity currentManagedSys, ManagedSystemService managedSystemService) {\\n        def exchangeManagedSys = managedSystemService.getManagedSysByName('MTS-WIN02-POWERSHELL-EXCHANGE2010')\\n        def found = pUser.principalList.find {Login l-> l.managedSysId == exchangeManagedSys.managedSysId }\\n        if (!found) {\\n            def currentLogin = pUser.principalList.find {Login l-> l.managedSysId == currentManagedSys.managedSysId }\\n            if (currentLogin) {\\n                def exchangeLogin = new Login()\\n                exchangeLogin.operation = AttributeOperationEnum.ADD\\n                exchangeLogin.domainId = currentLogin.domainId\\n                exchangeLogin.login = currentLogin.login\\n                exchangeLogin.managedSysId = exchangeManagedSys.managedSysId\\n                pUser.principalList.add(exchangeLogin)\\n            }\\n        }\\n    }\\n\\n    boolean insertPrimaryAddressItem(ProvisionUser pUser, String item, String value) {\\n        def address = pUser.addresses?.find { Address a-> a.metadataTypeId == 'PRIMARY_LOCATION' }\\n        def isNew = false\\n        if (!address) {\\n            isNew = true\\n            address = new Address()\\n            address.metadataTypeId = 'PRIMARY_LOCATION'\\n            pUser.addresses.add(address)\\n        }\\n        if (address.\\\"$item\\\" != value) {\\n            if (address.operation == AttributeOperationEnum.NO_CHANGE) {\\n                address.operation = isNew ? AttributeOperationEnum.ADD : AttributeOperationEnum.REPLACE\\n            }\\n            address.\\\"$item\\\" = value\\n            return true\\n        }\\n        return false\\n    }\\n\\n    def addAttribute(ProvisionUser pUser, String attributeName, String attributeValue) {\\n        def userAttr = new UserAttribute(attributeName, attributeValue)\\n        if (!pUser.userAttributes.containsKey(attributeName)) {\\n            userAttr.operation = AttributeOperationEnum.ADD\\n        } else {\\n            if (userAttr.value != attributeValue) {\\n                userAttr.operation = AttributeOperationEnum.REPLACE\\n            }\\n        }\\n        pUser.userAttributes.put(attributeName, userAttr)\\n    }\\n}\\n\")), mdx(\"p\", null, \"For different situations one can create separate scripts. Or one can have one script for all situations like this one.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"import org.openiam.base.AttributeOperationEnum\\nimport org.openiam.dozer.converter.LoginDozerConverter\\nimport org.openiam.dozer.converter.UserDozerConverter\\nimport org.openiam.idm.searchbeans.LoginSearchBean\\nimport org.openiam.idm.searchbeans.UserSearchBean\\nimport org.openiam.idm.srvc.auth.dto.Login\\nimport org.openiam.idm.srvc.auth.login.LoginDataService\\nimport org.openiam.idm.srvc.continfo.dto.Address\\nimport org.openiam.idm.srvc.mngsys.domain.ManagedSysEntity\\nimport org.openiam.idm.srvc.mngsys.service.ManagedSystemService\\nimport org.openiam.idm.srvc.res.service.ResourceService\\nimport org.openiam.idm.srvc.user.domain.UserEntity\\nimport org.openiam.idm.srvc.user.dto.User\\nimport org.openiam.idm.srvc.user.service.UserDataService\\nimport org.openiam.idm.srvc.user.ws.UserDataWebService\\nimport org.openiam.provision.dto.ProvisionUser\\nimport org.openiam.idm.srvc.user.dto.UserStatusEnum\\nimport org.openiam.idm.srvc.user.dto.UserAttribute\\n\\nimport java.text.SimpleDateFormat\\n\\npublic class PowershellADPopulationScript extends org.openiam.idm.srvc.recon.service.AbstractPopulationScript {\\n\\n    def dateFormat = new SimpleDateFormat(\\\"yyyy-MM-dd\\\")\\n\\n    public int execute(Map<String, String> line, ProvisionUser pUser) {\\n        int retval = 1\\n        for(String key: line.keySet()) {\\n            switch(key) {\\n                case \\\"SamAccountName\\\":\\n                    addAttribute(pUser, \\\"sAMAccountName\\\", line.get(\\\"SamAccountName\\\"))\\n                    break\\n                case \\\"EmployeeID\\\":\\n                    if(pUser.employeeId != line.get(\\\"EmployeeID\\\")){\\n                        pUser.employeeId = line.get(\\\"EmployeeID\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"employeeID\\\", line.get(\\\"EmployeeID\\\"))\\n                    break\\n                case \\\"employeeType\\\":\\n                    if(pUser.employeeType != line.get(\\\"employeeType\\\")){\\n                        pUser.employeeType = line.get(\\\"employeeType\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"employeeType\\\", line.get(\\\"employeeType\\\"))\\n                    break\\n                case \\\"GivenName\\\":\\n                    if(pUser.firstName != line.get(\\\"GivenName\\\")){\\n                        pUser.firstName = line.get(\\\"GivenName\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"givenName\\\", line.get(\\\"GivenName\\\"))\\n                    break\\n                case \\\"Surname\\\":\\n                    if(pUser.lastName != line.get(\\\"Surname\\\")){\\n                        pUser.lastName = line.get(\\\"Surname\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"sn\\\", line.get(\\\"Surname\\\"))\\n                    break\\n                case \\\"Initials\\\":\\n                    if(pUser.middleInit != line.get(\\\"Initials\\\")){\\n                        pUser.middleInit = line.get(\\\"Initials\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"initials\\\", line.get(\\\"Initials\\\"))\\n                    break\\n                case \\\"OtherName\\\":\\n                    if(pUser.nickname != line.get(\\\"OtherName\\\")){\\n                        pUser.nickname = line.get(\\\"OtherName\\\")\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"otherName\\\", line.get(\\\"OtherName\\\"))\\n                    break\\n                case \\\"AccountExpires\\\":\\n                    if (line.get(\\\"AccountExpires\\\")) {\\n                        def d = line.get(\\\"AccountExpires\\\") as Long\\n                        GregorianCalendar win32Epoch = new GregorianCalendar(1601, Calendar.JANUARY, 1);\\n                        def ms = (d / 10000) + win32Epoch.getTimeInMillis() as Long\\n                        def accountExpiresDate = new Date(ms)\\n                        if (!accountExpiresDate.after(dateFormat.parse('9999-12-31'))) {\\n                            if (!pUser.lastDate?.equals(accountExpiresDate)) {\\n                                pUser.lastDate = accountExpiresDate\\n                                retval = 0\\n                            }\\n                        }\\n                    }\\n                    addAttribute(pUser, \\\"accountExpires\\\", line.get(\\\"AccountExpires\\\"))\\n                    break\\n                case \\\"City\\\":\\n                    if (insertPrimaryAddressItem(pUser, 'city', line.get(\\\"City\\\"))) {\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"l\\\", line.get(\\\"City\\\"))\\n                    break\\n                case \\\"State\\\":\\n                    if (insertPrimaryAddressItem(pUser, 'state', line.get(\\\"State\\\"))) {\\n                        retval = 0\\n                    }\\n                    addAttribute(pUser, \\\"st\\\", line.get(\\\"State\\\"))\\n                    break\\n                case \\\"HomeDirectory\\\":\\n                    addAttribute(pUser, \\\"homeDirectory\\\", line.get(\\\"HomeDirectory\\\"))\\n                    break\\n                case \\\"homeDrive\\\":\\n                    addAttribute(pUser, \\\"homeDrive\\\", line.get(\\\"homeDrive\\\"))\\n                    break\\n                case \\\"UserPrincipalName\\\":\\n                    addAttribute(pUser, \\\"userPrincipalName\\\", line.get(\\\"UserPrincipalName\\\"))\\n                    break\\n                case \\\"DistinguishedName\\\":\\n                    addAttribute(pUser, \\\"distinguishedName\\\", line.get(\\\"DistinguishedName\\\"))\\n                    break\\n                case \\\"ObjectGUID\\\":\\n                    addAttribute(pUser, \\\"objectGUID\\\", line.get(\\\"ObjectGUID\\\"))\\n                    break\\n                case \\\"extensionAttribute1\\\":\\n                    addAttribute(pUser, \\\"extensionAttribute1\\\", line.get(\\\"extensionAttribute1\\\"))\\n                    break\\n                case \\\"extensionAttribute2\\\":\\n                    addAttribute(pUser, \\\"extensionAttribute2\\\", line.get(\\\"extensionAttribute2\\\"))\\n                    break\\n                case \\\"Managers\\\":\\n                    if (line.get(\\\"Managers\\\")) {\\n                        def principalName = line.get(\\\"Managers\\\")\\n                        if (principalName) {\\n                            def loginManager = context.getBean(\\\"loginManager\\\") as LoginDataService\\n                            def principals = loginManager.getLoginDetailsByManagedSys(principalName, managedSysId)\\n                            if (principals) {\\n                                def login = principals.get(0)\\n                                if (!pUser.superiors?.find {it.userId == login.userId}) {\\n                                    pUser.superiors?.each { // remove previous managers if any\\n                                        it.operation = AttributeOperationEnum.DELETE\\n                                    }\\n                                    def userManager = context.getBean(\\\"userManager\\\") as UserDataService\\n                                    def superior = userManager.getUserDto(login.userId)\\n                                    if (superior) {\\n                                        superior.operation = AttributeOperationEnum.ADD\\n                                        pUser.addSuperior(superior)\\n                                    }\\n                                }\\n                            }\\n                        }\\n                    }\\n                    addAttribute(pUser, \\\"managers\\\", line.get(\\\"Managers\\\"))\\n                    break\\n            }\\n        }\\n\\n        def managedSystemService = context.getBean(ManagedSystemService.class)\\n        def resourceService = context.getBean(ResourceService.class)\\n        def currentManagedSys = managedSystemService.getManagedSysById(managedSysId)\\n        def currentResource = resourceService.getResourceDTO(currentManagedSys.resourceId)\\n        if (!pUser?.resources?.find { it.resourceId == currentResource.resourceId }) {\\n            currentResource.operation = AttributeOperationEnum.ADD\\n            pUser.resources.add(currentResource)\\n        }\\n        //set status to active: IMPORTANT!!!!\\n        if (!pUser.status) {\\n            pUser.status = UserStatusEnum.PENDING_INITIAL_LOGIN\\n        }\\n        if (!pUser.metadataTypeId) {\\n            pUser.metadataTypeId = \\\"Contractor\\\"\\n        }\\n        //addExchangePrincipal(pUser, currentManagedSys, managedSystemService)\\n        return retval\\n    }\\n\\n    def addExchangePrincipal(ProvisionUser pUser, ManagedSysEntity currentManagedSys, ManagedSystemService managedSystemService) {\\n        def exchangeManagedSys = managedSystemService.getManagedSysByName('MTS-WIN02-POWERSHELL-EXCHANGE2010')\\n        def found = pUser.principalList.find {Login l-> l.managedSysId == exchangeManagedSys.id }\\n        if (!found) {\\n            def currentLogin = pUser.principalList.find {Login l-> l.managedSysId == currentManagedSys.id }\\n            if (currentLogin) {\\n                def exchangeLogin = new Login()\\n                exchangeLogin.operation = AttributeOperationEnum.ADD\\n               // exchangeLogin.domainId = currentLogin.domainId\\n                exchangeLogin.login = currentLogin.login\\n                exchangeLogin.managedSysId = exchangeManagedSys.id\\n                pUser.principalList.add(exchangeLogin)\\n            }\\n        }\\n    }\\n\\n    boolean insertPrimaryAddressItem(ProvisionUser pUser, String item, String value) {\\n        def address = pUser.addresses?.find { Address a-> a.metadataTypeId == 'PRIMARY_LOCATION' }\\n        def isNew = false\\n        if (!address) {\\n            isNew = true\\n            address = new Address()\\n            address.metadataTypeId = 'PRIMARY_LOCATION'\\n            pUser.addresses.add(address)\\n        }\\n        if (address.\\\"$item\\\" != value) {\\n            if (address.operation == AttributeOperationEnum.NO_CHANGE) {\\n                address.operation = isNew ? AttributeOperationEnum.ADD : AttributeOperationEnum.REPLACE\\n            }\\n            address.\\\"$item\\\" = value\\n            return true\\n        }\\n        return false\\n    }\\n\\n    def addAttribute(ProvisionUser pUser, String attributeName, String attributeValue) {\\n        def userAttr = new UserAttribute(attributeName, attributeValue)\\n        if (!pUser.userAttributes.containsKey(attributeName)) {\\n            userAttr.operation = AttributeOperationEnum.ADD\\n        } else {\\n            if (userAttr.value != attributeValue) {\\n                userAttr.operation = AttributeOperationEnum.REPLACE\\n            }\\n        }\\n        pUser.userAttributes.put(attributeName, userAttr)\\n    }\\n}\\n\")), mdx(\"h3\", null, \"Do Nothing Script\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"import org.openiam.base.BaseAttribute\\nimport org.openiam.idm.srvc.grp.dto.Group\\nimport org.openiam.idm.srvc.recon.dto.ReconciliationSituation\\nimport org.openiam.idm.srvc.recon.service.PopulationScript\\nimport org.openiam.idm.srvc.recon.service.ReconciliationObjectAbstractCommand\\nimport org.openiam.provision.dto.ProvisionGroup\\nimport org.openiam.provision.service.AbstractProvisioningService\\nimport org.openiam.provision.type.ExtensibleAttribute\\nimport org.apache.commons.logging.Log;\\nimport org.apache.commons.logging.LogFactory;\\nimport org.apache.commons.collections.CollectionUtils;\\nimport org.apache.commons.lang.StringUtils\\nimport org.openiam.script.ScriptIntegration;\\n\\npublic class DoNothingGroupCommand extends ReconciliationObjectAbstractCommand<Group> {\\n    private static final Log log = LogFactory.getLog(DoNothingGroupCommand.class);\\n\\n    @Override\\n    boolean execute(ReconciliationSituation config, String principal, String mSysID, Group group, List<ExtensibleAttribute> attributes) {\\n        log.debug(\\\"Entering DoNothingCommand Groovy\\\");\\n        log.debug(\\\"Do nothing for Group :\\\" + principal);\\n        ProvisionGroup pGroup = new ProvisionGroup(group);\\n        pGroup.setSrcSystemId(mSysID);\\n        if(StringUtils.isNotEmpty(config.getScript())){\\n            try {\\n                Map<String, String> line = new HashMap<String, String>();\\n                for (ExtensibleAttribute attr : attributes) {\\n                    if (attr.getValue() != null) {\\n                        line.put(attr.getName(), attr.getValue());\\n                    } else if (attr.getAttributeContainer() != null &&\\n                            CollectionUtils.isNotEmpty(attr.getAttributeContainer().getAttributeList()) &&\\n                            line.get(attr.getName()) == null) {\\n                        StringBuilder value = new StringBuilder();\\n                        boolean isFirst = true;\\n                        for (BaseAttribute ba : attr.getAttributeContainer().getAttributeList()) {\\n                            if (!isFirst) {\\n                                value.append('^');\\n                            } else {\\n                                isFirst = false;\\n                            }\\n                            value.append(ba.getValue());\\n                        }\\n                        line.put(attr.getName(), value.toString());\\n                    }\\n                }\\n                Map<String, Object> bindingMap = new HashMap<String, Object>();\\n                bindingMap.put(AbstractProvisioningService.TARGET_SYS_MANAGED_SYS_ID, mSysID);\\n                ScriptIntegration scriptRunner = context.getBean(\\\"configurableGroovyScriptEngine\\\");\\n                PopulationScript<ProvisionGroup> script = (PopulationScript<ProvisionGroup>) scriptRunner.instantiateClass(bindingMap, config.getScript());\\n                int retval = script.execute(line, pGroup);\\n            } catch (IOException e) {\\n                e.printStackTrace();\\n            } catch (Exception e) {\\n                e.printStackTrace();\\n            }\\n        }\\n\\n        return true;\\n    }\\n\\n}\\n\")), mdx(\"h3\", null, \"Search Query Script\"), mdx(\"p\", null, \"A Groovy script to extract data from target system for reconciliation. At the output we obtain a search string (used in LDAP/AD).\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"\\ndef sf = binding.hasVariable(\\\"searchFilter\\\")? searchFilter : \\\"{Name -like '*'}\\\"\\ndef us = binding.hasVariable(\\\"updatedSince\\\")? updatedSince : \\\"\\\"\\n\\n//import org.openiam.idm.srvc.role.dto.RoleAttribute\\noutput = \\\"Get-ADUser -Filter ${sf} -Properties *\\\" as String\\n/*if(role != null) {\\n    Set<RoleAttribute> attributes =  role.getRoleAttributes();\\n    for(RoleAttribute attr : attributes) {\\n        if(\\\"AD_OU\\\".equals(attr.getName())) {\\n            output=\\\"Get-ADUser -Filter {Name -like '*'} -SearchBase '\\\"+attr.getValue()+\\\"' -Properties * -searchscope 1\\\";\\n            break;\\n        };\\n    }\\n} else if(group != null) {\\n    output=\\\"Get-ADGroupMember -Identity \\\"+group.name;\\n}*/\\n\\n\")), mdx(\"h3\", null, \"Pre-/PostExecutor Script Example\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"import org.openiam.idm.srvc.msg.service.MailService\\nimport org.openiam.idm.srvc.recon.dto.ReconciliationConfig\\nimport org.openiam.idm.srvc.recon.service.ReconciliationServiceImpl\\nimport org.openiam.idm.srvc.res.dto.Resource\\nimport org.openiam.provision.service.AbstractPrePostExecutor\\nimport org.apache.commons.lang.StringUtils\\n\\npublic class PrePostExecutorSample extends AbstractPrePostExecutor {\\n    @Override\\n    int execute(Map<String, Object> bindingMap) {\\n        ReconciliationConfig config = (ReconciliationConfig)bindingMap.get(ReconciliationServiceImpl.RECONCILIATION_CONFIG)\\n        this.sendMail(config);\\n        return 0;\\n    }\\n\\n    private void sendMail(ReconciliationConfig config) {\\n        StringBuilder message = new StringBuilder();\\n        if (!StringUtils.isEmpty(config.getNotificationEmailAddress())) {\\n            message.append(\\\"Resource: \\\" + config.managedSysId + \\\".\\\\n\\\");\\n            message.append(\\\"Uploaded CSV file: \\\" + config.managedSysId + \\\".csv was successfully reconciled.\\\\n\\\");\\n            MailService mailService = context.getBean(\\\"mailService\\\");\\n            mailService.sendEmails(null, new String[1] { config.getNotificationEmailAddress() }, null, null,\\n                    \\\"CSVConnector\\\", message.toString(), false, new String[0] {});\\n        }\\n    }\\n}\\n\")));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#developing-a-script","title":"Developing a Script"},{"url":"#scripts-examples","title":"Scripts Examples","items":[{"items":[{"url":"#population-sciprts-for-ad-powershell","title":"Population sciprts for AD Powershell."},{"url":"#do-nothing-script","title":"Do Nothing Script"},{"url":"#search-query-script","title":"Search Query Script"},{"url":"#pre-postexecutor-script-example","title":"Pre-/PostExecutor Script Example"}]}]}]},"parent":{"relativePath":"admin/5-lifecycle/5-recon-groovy.md"},"frontmatter":{"metaTitle":"Groovy Scripts for Reconciliation","metaDescription":"This section provides useful Groovy Scripts for reconciliation and data on developing them"}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/admin","title":"Administration guide"}}},{"node":{"fields":{"slug":"/appendix","title":"Appendix"}}},{"node":{"fields":{"slug":"/connectorconfig","title":"IdM Connectors"}}},{"node":{"fields":{"slug":"/changelog","title":"Change log"}}},{"node":{"fields":{"slug":"/developerguide","title":"Developer Guide"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice","title":"End user guide for SelfService portal"}}},{"node":{"fields":{"slug":"/getting-started","title":"Getting Started"}}},{"node":{"fields":{"slug":"/","title":"Welcome to the OpenIAM Documentation"}}},{"node":{"fields":{"slug":"/ssocatalog","title":"SSO Catalog"}}},{"node":{"fields":{"slug":"/troubleshooting","title":"FAQ / Troubleshooting"}}},{"node":{"fields":{"slug":"/admin/0-login","title":"Logging in to the admin portal"}}},{"node":{"fields":{"slug":"/admin/1-exportimport","title":"Import / Export"}}},{"node":{"fields":{"slug":"/admin/1-usradmin","title":"User administration"}}},{"node":{"fields":{"slug":"/installation","title":"Installing OpenIAM"}}},{"node":{"fields":{"slug":"/admin/10-consent-management","title":"Consent management"}}},{"node":{"fields":{"slug":"/admin/10-password","title":"Password policy"}}},{"node":{"fields":{"slug":"/admin/12-administration","title":"Administration"}}},{"node":{"fields":{"slug":"/admin/13-selfregistration","title":"Self-registration"}}},{"node":{"fields":{"slug":"/admin/15-audit","title":"Audit"}}},{"node":{"fields":{"slug":"/admin/14-Help.Desk.User.Profile.Protection","title":"HelpDesk profile protection"}}},{"node":{"fields":{"slug":"/admin/16-admin-pswd-change","title":"Password reset for administrator's account"}}},{"node":{"fields":{"slug":"/whatsnew","title":"What's new in OpenIAM"}}},{"node":{"fields":{"slug":"/admin/19-reports","title":"OpenIAM report services"}}},{"node":{"fields":{"slug":"/admin/2-authentication","title":"Authentication"}}},{"node":{"fields":{"slug":"/admin/20-virtual-tentant-by-org","title":"Enabling a virtual tenant by organization"}}},{"node":{"fields":{"slug":"/admin/3-authz","title":"Managing access"}}},{"node":{"fields":{"slug":"/admin/4-app-onboarding","title":"Application onboarding"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle","title":"Automated provisioning"}}},{"node":{"fields":{"slug":"/admin/6-requestapprov","title":"Requests / Approval"}}},{"node":{"fields":{"slug":"/admin/7-access-cert","title":"User access review"}}},{"node":{"fields":{"slug":"/admin/8-sso","title":"Federation / SSO to applications"}}},{"node":{"fields":{"slug":"/admin/9-r-Proxy","title":"Access gateway"}}},{"node":{"fields":{"slug":"/admin/18-services-passwd-change-k8","title":"Password update for OpenIAM services in Kubernetes"}}},{"node":{"fields":{"slug":"/admin/17-services-manual-passwd-change","title":"Manual password update for OpenIAM services in RPM"}}},{"node":{"fields":{"slug":"/changelog/11-Release-4.2.1.5","title":"Release 4.2.1.5"}}},{"node":{"fields":{"slug":"/changelog/12-Release-4.2.1.6","title":"Release 4.2.1.6"}}},{"node":{"fields":{"slug":"/changelog/13-Release-4.2.1.7","title":"Release 4.2.1.7"}}},{"node":{"fields":{"slug":"/changelog/14-Release-4.2.1.8","title":"Release 4.2.1.8"}}},{"node":{"fields":{"slug":"/changelog/15-Release-4.2.1.9","title":"Release 4.2.1.9"}}},{"node":{"fields":{"slug":"/changelog/16-Release-4.2.1.10","title":"Release 4.2.1.10"}}},{"node":{"fields":{"slug":"/changelog/17-Release-4.2.1.11","title":"Release 4.2.1.11"}}},{"node":{"fields":{"slug":"/changelog/18-Release-4.2.1.12","title":"Release 4.2.1.12"}}},{"node":{"fields":{"slug":"/changelog/19-Release-4.2.1.13","title":"Release 4.2.1.13"}}},{"node":{"fields":{"slug":"/changelog/20-Release-4.2.1.14","title":"Release 4.2.1.14"}}},{"node":{"fields":{"slug":"/changelog/22-v2026.1.1","title":"Changelog for v2026.1.1"}}},{"node":{"fields":{"slug":"/changelog/21-Release-4.2.1.15","title":"Release 4.2.1.15"}}},{"node":{"fields":{"slug":"/appendix/2-openssl","title":"Install OpenSSL"}}},{"node":{"fields":{"slug":"/appendix/1-self-signedcert","title":"Generate Self-signed Cert"}}},{"node":{"fields":{"slug":"/appendix/4-prepforprod","title":"Prepare for Production"}}},{"node":{"fields":{"slug":"/appendix/3-installopenldap","title":"Install OpenLDAP on Ubuntu"}}},{"node":{"fields":{"slug":"/connectorconfig/2-configparam","title":"Connector parameters"}}},{"node":{"fields":{"slug":"/connectorconfig/4-troubleshootingconnector","title":"Provisioning operations troubleshooting"}}},{"node":{"fields":{"slug":"/connectorconfig/JDBC","title":"JDBC connector"}}},{"node":{"fields":{"slug":"/connectorconfig/LDAP","title":"LDAP connector"}}},{"node":{"fields":{"slug":"/connectorconfig/SAPUME","title":"SAP UME connector"}}},{"node":{"fields":{"slug":"/connectorconfig/adp","title":"ADP connector"}}},{"node":{"fields":{"slug":"/connectorconfig/aerospike","title":"Aerospike connector"}}},{"node":{"fields":{"slug":"/connectorconfig/freeIPA","title":"FreeIPA connector"}}},{"node":{"fields":{"slug":"/connectorconfig/aws","title":"AWS connector"}}},{"node":{"fields":{"slug":"/connectorconfig/gsuite","title":"GSuite connector"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft","title":"Microsoft Application Connectors"}}},{"node":{"fields":{"slug":"/connectorconfig/linux","title":"Linux connector"}}},{"node":{"fields":{"slug":"/connectorconfig/oracleebs","title":"Oracle EBS connector"}}},{"node":{"fields":{"slug":"/connectorconfig/oracle","title":"Oracle RDBMS connector"}}},{"node":{"fields":{"slug":"/connectorconfig/postgresql","title":"PostgreSQL connector"}}},{"node":{"fields":{"slug":"/connectorconfig/rexx","title":"Rexx connector"}}},{"node":{"fields":{"slug":"/connectorconfig/scriptConnector","title":"Groovy Script connector"}}},{"node":{"fields":{"slug":"/developerguide/1-custom-css","title":"Customize Branding"}}},{"node":{"fields":{"slug":"/developerguide/10-OpenIAM-opensource-rep","title":"OpenIAM open source repository"}}},{"node":{"fields":{"slug":"/connectorconfig/scim","title":"SCIM connector"}}},{"node":{"fields":{"slug":"/connectorconfig/workday","title":"Workday connector"}}},{"node":{"fields":{"slug":"/developerguide/2-api","title":"RESTful API"}}},{"node":{"fields":{"slug":"/developerguide/3-whitelisting","title":"Whitelisting packages"}}},{"node":{"fields":{"slug":"/developerguide/4-scheduledtasks","title":"Batch/Scheduled tasks"}}},{"node":{"fields":{"slug":"/developerguide/5-datamodel","title":"Data model"}}},{"node":{"fields":{"slug":"/developerguide/6-ide","title":"Script development using an IDE"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization","title":"Synchronization Scripts"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/2-selfservice","title":"Operations via SelfService portal"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/1-login","title":"Logging in to SelfService portal"}}},{"node":{"fields":{"slug":"/connectorconfig/tableau","title":"Tableau connector"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/6-singlesignon","title":"Single sign-on"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/7-useraccess","title":"User access rights"}}},{"node":{"fields":{"slug":"/getting-started/1-what_is_openiam","title":"What is OpenIAM?"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest","title":"Request management"}}},{"node":{"fields":{"slug":"/getting-started/2-productarchitecture","title":"Platform architecture"}}},{"node":{"fields":{"slug":"/getting-started/21-concepts","title":"Concepts"}}},{"node":{"fields":{"slug":"/getting-started/3-install_openiam","title":"Installing OpenIAM"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding","title":"Application onboarding"}}},{"node":{"fields":{"slug":"/getting-started/5-connecting","title":"Connecting to an authoritative source"}}},{"node":{"fields":{"slug":"/getting-started/6-automatedprovisioning","title":"Automated user provisioning"}}},{"node":{"fields":{"slug":"/getting-started/31-planning-workforce","title":"Discovery questions"}}},{"node":{"fields":{"slug":"/getting-started/7-selfservice-pswd","title":"SelfService password reset"}}},{"node":{"fields":{"slug":"/getting-started/8-openiam-with-IdP","title":"Integrating OpenIAM with your IdP"}}},{"node":{"fields":{"slug":"/getting-started/9-openiam-as-IdP","title":"Integrating OpenIAM as your IdP"}}},{"node":{"fields":{"slug":"/getting-started/99-multifactor-authentication","title":"Configuring multi-factor authentication"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation","title":"Deploying via Docker"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation","title":"Deploying via RPM on Linux"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation","title":"Deploying to Kubernetes"}}},{"node":{"fields":{"slug":"/installation/7-OpenShift-installation","title":"Deploying on OpenShift"}}},{"node":{"fields":{"slug":"/installation/9-miscellaneous","title":"Miscellaneous related articles"}}},{"node":{"fields":{"slug":"/installation/8-sizing","title":"Sizing recommendations"}}},{"node":{"fields":{"slug":"/installation/9-data_migration","title":"OpenIAM data migration"}}},{"node":{"fields":{"slug":"/ssocatalog/AWS","title":"AWS SSO"}}},{"node":{"fields":{"slug":"/ssocatalog/Gsuite","title":"GSuite SSO"}}},{"node":{"fields":{"slug":"/ssocatalog/Azure","title":"Azure SSO"}}},{"node":{"fields":{"slug":"/ssocatalog/Freshdesk","title":"Freshdesk SSO"}}},{"node":{"fields":{"slug":"/ssocatalog/Office365","title":"Office365 SSO"}}},{"node":{"fields":{"slug":"/ssocatalog/Salesforce","title":"Salesforce.com"}}},{"node":{"fields":{"slug":"/troubleshooting/cluster","title":"Cluster"}}},{"node":{"fields":{"slug":"/ssocatalog/okta","title":"Okta SSO"}}},{"node":{"fields":{"slug":"/troubleshooting/docker","title":"Docker Swarm"}}},{"node":{"fields":{"slug":"/troubleshooting/environment","title":"Environment"}}},{"node":{"fields":{"slug":"/troubleshooting/operational","title":"Operational"}}},{"node":{"fields":{"slug":"/troubleshooting/rpm","title":"RPM"}}},{"node":{"fields":{"slug":"/troubleshooting/v3_update","title":"Update from V3.X to V4.X"}}},{"node":{"fields":{"slug":"/whatsnew/1-v420","title":"New in v4.2.0.0"}}},{"node":{"fields":{"slug":"/whatsnew/10-v4218","title":"New in v4.2.1.8"}}},{"node":{"fields":{"slug":"/whatsnew/12-v42110","title":"New in v4.2.1.10"}}},{"node":{"fields":{"slug":"/whatsnew/11-v4219","title":"New in v4.2.1.9"}}},{"node":{"fields":{"slug":"/whatsnew/14-v42112","title":"New in v4.2.1.12"}}},{"node":{"fields":{"slug":"/whatsnew/13-v42111","title":"New in v4.2.1.11"}}},{"node":{"fields":{"slug":"/troubleshooting/connectors","title":"Connectors"}}},{"node":{"fields":{"slug":"/whatsnew/17-v2026.1.1","title":"New in v2026.1.1"}}},{"node":{"fields":{"slug":"/whatsnew/16-v422","title":"New in v4.2.2"}}},{"node":{"fields":{"slug":"/whatsnew/16-v42115","title":"New in v4.2.1.15"}}},{"node":{"fields":{"slug":"/whatsnew/18-v2026.2.1","title":"New in v2026.2.1"}}},{"node":{"fields":{"slug":"/whatsnew/7-v4215","title":"New in v4.2.1.5"}}},{"node":{"fields":{"slug":"/whatsnew/9-v4217","title":"New in v4.2.1.7"}}},{"node":{"fields":{"slug":"/whatsnew/15-v42113","title":"New in v4.2.1.13"}}},{"node":{"fields":{"slug":"/whatsnew/8-v4216","title":"New in v4.2.1.6"}}},{"node":{"fields":{"slug":"/connectorconfig/sap","title":"SAP S/4 Hana connector"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/10-bulkoperations","title":"Bulk operations"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/11-bulkentitlements","title":"Bulk operations with entitlements"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/12-externaldelegation","title":"Organization level delegation"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/13-unlock-account","title":"Unlocking an account"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/14-add-remove-entitlements","title":"Adding/Removing entitlements"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/15-rehireuserflow","title":"Rehire user flow"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/16-user-conversion","title":"User conversion"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/17-newhireworkflow","title":"New hire workflow configuration"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/1-createuser","title":"Creating a user"}}},{"node":{"fields":{"slug":"/connectorconfig/salesforce","title":"Salesforce.com connector"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/2-usertypes","title":"Custom user types"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/4-pageconfiguration","title":"Configuring page templates"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/3-adminoperations","title":"Administrative actions on a User"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/5-finduser","title":"User search"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/7-customfields","title":"Custom fields"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/6-relatedAccount","title":"Related accounts"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/8-serviceaccounts","title":"Service accounts"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/9-orphanmanagement","title":"Orphan management"}}},{"node":{"fields":{"slug":"/admin/10-password/1-pswd-compromised","title":"Password breach detection"}}},{"node":{"fields":{"slug":"/admin/12-administration/2-mail-management","title":"Mail management"}}},{"node":{"fields":{"slug":"/admin/12-administration/1-sysconfig","title":"System configuration"}}},{"node":{"fields":{"slug":"/admin/12-administration/3-squence-generator","title":"Sequence generators"}}},{"node":{"fields":{"slug":"/admin/12-administration/4-otpconfig","title":"Configure OTP Provider"}}},{"node":{"fields":{"slug":"/admin/12-administration/5-links","title":"External links on login page"}}},{"node":{"fields":{"slug":"/admin/12-administration/6-languages","title":"Managing languages"}}},{"node":{"fields":{"slug":"/admin/12-administration/7-reconciliationhistory","title":"Reconciliation history"}}},{"node":{"fields":{"slug":"/admin/12-administration/8-aboutopenIAM-page","title":"About OpenIAM Page"}}},{"node":{"fields":{"slug":"/admin/2-authentication/12-account-unlock","title":"Setting up account unlock"}}},{"node":{"fields":{"slug":"/admin/12-administration/9-reindex_elasticsearch","title":"Reindex Opensearch"}}},{"node":{"fields":{"slug":"/admin/2-authentication/11-credentialprovider","title":"Credential provider"}}},{"node":{"fields":{"slug":"/admin/2-authentication/12-certificateauth","title":"Configuring certificate-based authentication"}}},{"node":{"fields":{"slug":"/admin/2-authentication/13-criiptoauth","title":"Criipto authentication"}}},{"node":{"fields":{"slug":"/admin/2-authentication/14-duo-auth","title":"Duo authentication"}}},{"node":{"fields":{"slug":"/admin/2-authentication/2-auth-policy","title":"Authentication policy"}}},{"node":{"fields":{"slug":"/admin/2-authentication/15-modernauth","title":"Microsoft Modern authentication"}}},{"node":{"fields":{"slug":"/admin/2-authentication/16-external-multiselect-auth","title":"External/multiselect authentication"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/18-creating-new-dept-division","title":"Creating a new department or division"}}},{"node":{"fields":{"slug":"/admin/2-authentication/21-dashboards","title":"Monitoring dashboards"}}},{"node":{"fields":{"slug":"/admin/2-authentication/3-passwordauth","title":"Password-based authentication"}}},{"node":{"fields":{"slug":"/admin/2-authentication/2-delegatedauth","title":"Managed System authentication"}}},{"node":{"fields":{"slug":"/admin/2-authentication/8-social","title":"Social authentication"}}},{"node":{"fields":{"slug":"/admin/3-authz/10-accessright","title":"Access rights"}}},{"node":{"fields":{"slug":"/admin/2-authentication/9-adaptiveauth","title":"Adaptive authentication"}}},{"node":{"fields":{"slug":"/admin/3-authz/1-overview","title":"Introduction to access control"}}},{"node":{"fields":{"slug":"/admin/3-authz/11-contentprovider","title":"Content provider"}}},{"node":{"fields":{"slug":"/admin/3-authz/14-menus","title":"Menus"}}},{"node":{"fields":{"slug":"/admin/3-authz/2-roles","title":"Managing roles"}}},{"node":{"fields":{"slug":"/admin/3-authz/3-conflict-groups","title":"Conflict Groups"}}},{"node":{"fields":{"slug":"/admin/3-authz/3-groups","title":"Managing groups"}}},{"node":{"fields":{"slug":"/admin/3-authz/4-types","title":"Metadata types"}}},{"node":{"fields":{"slug":"/admin/3-authz/5-resources","title":"Managing resources"}}},{"node":{"fields":{"slug":"/admin/3-authz/8-accesstossoapps","title":"Access to SSO applications"}}},{"node":{"fields":{"slug":"/admin/3-authz/6-organization","title":"Managing organizations"}}},{"node":{"fields":{"slug":"/admin/4-app-onboarding/1-Automated-applications","title":"Connected applications"}}},{"node":{"fields":{"slug":"/admin/3-authz/9-approvalflow","title":"Configuring approval workflows"}}},{"node":{"fields":{"slug":"/admin/4-app-onboarding/2-Manual-applications","title":"Manual applications"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/10-managedsystemsimulation","title":"Managed system simulation mode"}}},{"node":{"fields":{"slug":"/admin/2-authentication/7-otp","title":"OTP over SMS or E-mail"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/11-provisioning-config","title":"Configure Provisioning"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/12-LDAP-managedsys-config","title":"LDAP Managed system configuration"}}},{"node":{"fields":{"slug":"/admin/2-authentication/10-fidologin","title":"FIDO-2 authentication"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/2-incrementalsynch","title":"Incremental synchronization"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/1-synch","title":"Configuring synchronization"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/3-recon","title":"Configure reconciliation"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/4-birthright","title":"Birthright access"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/5-recon-groovy","title":"Groovy Scripts for Reconciliation"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/6-managedsystem-config","title":"Managed system configuration"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/8-importentitlements","title":"Import entitlements"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/9-importorganization","title":"Import Organizations"}}},{"node":{"fields":{"slug":"/admin/6-requestapprov/1-application-category","title":"Application categories"}}},{"node":{"fields":{"slug":"/admin/6-requestapprov/2-approval-flow","title":"Approval flow"}}},{"node":{"fields":{"slug":"/admin/6-requestapprov/3-manualTasks","title":"Manual tasks"}}},{"node":{"fields":{"slug":"/admin/6-requestapprov/4-post-request","title":"After request has been approved"}}},{"node":{"fields":{"slug":"/admin/6-requestapprov/5-approve-by-email","title":"Approving requests via Email"}}},{"node":{"fields":{"slug":"/admin/6-requestapprov/7-questionnaire","title":"Questionnaire"}}},{"node":{"fields":{"slug":"/admin/7-access-cert/1-entitlmentcert","title":"Entitlement based certification"}}},{"node":{"fields":{"slug":"/admin/7-access-cert/2-risk-event-driven-cert","title":"Risk event driven certification"}}},{"node":{"fields":{"slug":"/admin/7-access-cert/2-usercert","title":"User based review"}}},{"node":{"fields":{"slug":"/admin/7-access-cert/3-certification-reporting","title":"Certification reporting"}}},{"node":{"fields":{"slug":"/admin/7-access-cert/4-membership-tags","title":"Membership tags"}}},{"node":{"fields":{"slug":"/admin/7-access-cert/6-campaign-database","title":"Access certification campaigns as database objects"}}},{"node":{"fields":{"slug":"/admin/7-access-cert/5-delete-campaign","title":"Deleting an access certification campaign"}}},{"node":{"fields":{"slug":"/admin/7-access-cert/7-expiration-policy","title":"Expiration policy"}}},{"node":{"fields":{"slug":"/admin/7-access-cert/8-multiple-reviwer-campaigns","title":"Multi-reviewer user access review campaigns"}}},{"node":{"fields":{"slug":"/admin/8-sso/1-saml","title":"Add SAML SP to OpenIAM"}}},{"node":{"fields":{"slug":"/admin/8-sso/2-oauth2","title":"oAuth 2.0"}}},{"node":{"fields":{"slug":"/admin/8-sso/3-oidc","title":"OpenID Connect"}}},{"node":{"fields":{"slug":"/admin/8-sso/5-auth_scopes","title":"OpenIAM oAuth scopes"}}},{"node":{"fields":{"slug":"/admin/9-r-Proxy/1-formfill","title":"Form Fill"}}},{"node":{"fields":{"slug":"/admin/9-r-Proxy/2-headerinj","title":"Header Injection"}}},{"node":{"fields":{"slug":"/admin/9-r-Proxy/3-urlrewriting","title":"URL Rewriting"}}},{"node":{"fields":{"slug":"/admin/9-r-Proxy/6-example","title":"Examples"}}},{"node":{"fields":{"slug":"/admin/9-r-Proxy/7-rProxy-loadbalancer","title":"Reverse Proxy with Load Balancer"}}},{"node":{"fields":{"slug":"/admin/9-r-Proxy/8-kerberos","title":"Setting up Kerberos via rProxy"}}},{"node":{"fields":{"slug":"/admin/2-authentication/1-auth-overview","title":"Configuring authentication"}}},{"node":{"fields":{"slug":"/admin/12-administration/99-heartbeat","title":"Heartbeat links"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/10-winlocal","title":"WinLocal OpenIAM connector"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/1-powershellconnectorinstallation","title":"Installing PowerShell connectors"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/12-dynamics365FO","title":"Dynamics365 Finance&Operations connector"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/12-WindowsPasswordFilter","title":"AD Password Filter"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/13-successfactors","title":"SuccessFactors connector"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/15-powershell-generic","title":"Building a custom PowerShell connector for OpenIAM"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/14-psgraph","title":"Microsoft Graph PowerShell connector"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/2-powershellconnectorsusage","title":"Using PowerShell connectors"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/3-powershellconnectorupdate","title":"Updating PowerShell connectors"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/5-azuread","title":"Entra ID/O365 connector"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/6-exchange","title":"Exchange connector"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/7-azuredevops","title":"Azure DevOps connector"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/8-dynamics365","title":"Dynamics365 connector"}}},{"node":{"fields":{"slug":"/connectorconfig/scriptConnector/connector-request-template","title":"OpenIAM connector request template"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/9-sqlserver","title":"Microsoft SQL Server connector"}}},{"node":{"fields":{"slug":"/developerguide/1-custom-css/1-customcss","title":"Creating custom CSS"}}},{"node":{"fields":{"slug":"/developerguide/1-custom-css/2-cssexamples","title":"CSS file examples"}}},{"node":{"fields":{"slug":"/connectorconfig/scriptConnector/GroovyScriptConnector","title":"Configuring Groovy Script connector"}}},{"node":{"fields":{"slug":"/developerguide/2-api/1-postman","title":"Getting started with Postman"}}},{"node":{"fields":{"slug":"/developerguide/2-api/2-python","title":"Getting started with Python"}}},{"node":{"fields":{"slug":"/developerguide/2-api/3-java","title":"Getting started with Java"}}},{"node":{"fields":{"slug":"/developerguide/4-sheduledtasks/1-provision-on-date","title":"Provision/Deprovision on date"}}},{"node":{"fields":{"slug":"/developerguide/4-sheduledtasks/2-access-certification-reminder","title":"Notification reminders for approvers"}}},{"node":{"fields":{"slug":"/developerguide/5-datamodel/1-usermodel","title":"User data model"}}},{"node":{"fields":{"slug":"/developerguide/5-datamodel/2-rbacmodel","title":"Access control model"}}},{"node":{"fields":{"slug":"/developerguide/8-api/access-certification","title":"/webconsole - access-certification"}}},{"node":{"fields":{"slug":"/developerguide/8-api/access-right","title":"/webconsole - access-right"}}},{"node":{"fields":{"slug":"/developerguide/8-api/approver-association","title":"/webconsole - approver-association"}}},{"node":{"fields":{"slug":"/developerguide/8-api/audit-log","title":"/webconsole - audit-log"}}},{"node":{"fields":{"slug":"/developerguide/8-api/auth-provider","title":"/webconsole - auth-provider"}}},{"node":{"fields":{"slug":"/developerguide/8-api/authentication-grouping","title":"/webconsole - authentication-grouping"}}},{"node":{"fields":{"slug":"/developerguide/8-api/batch","title":"/webconsole - batch"}}},{"node":{"fields":{"slug":"/developerguide/8-api/challenge-response","title":"/webconsole - challenge-response"}}},{"node":{"fields":{"slug":"/developerguide/8-api/connector","title":"/webconsole - connector"}}},{"node":{"fields":{"slug":"/developerguide/8-api/content-provider","title":"/webconsole - content-provider"}}},{"node":{"fields":{"slug":"/developerguide/8-api/elastic-search","title":"/webconsole - elastic-search"}}},{"node":{"fields":{"slug":"/developerguide/8-api/field","title":"/webconsole - field"}}},{"node":{"fields":{"slug":"/developerguide/8-api/email","title":"/webconsole - email"}}},{"node":{"fields":{"slug":"/developerguide/8-api/groovy-manager","title":"/webconsole - groovy-manager"}}},{"node":{"fields":{"slug":"/developerguide/8-api/group","title":"/webconsole - group"}}},{"node":{"fields":{"slug":"/developerguide/8-api/idp-oauth","title":"/idp - idp-oauth"}}},{"node":{"fields":{"slug":"/developerguide/8-api/idp-rest","title":"/idp - idp-rest"}}},{"node":{"fields":{"slug":"/developerguide/8-api/it-policy","title":"/webconsole - it-policy"}}},{"node":{"fields":{"slug":"/developerguide/8-api/managed-system","title":"/webconsole - managed-system"}}},{"node":{"fields":{"slug":"/developerguide/8-api/menu","title":"/webconsole - menu"}}},{"node":{"fields":{"slug":"/developerguide/8-api/metadata","title":"/webconsole - metadata"}}},{"node":{"fields":{"slug":"/developerguide/8-api/organization-type","title":"/webconsole - organization-type"}}},{"node":{"fields":{"slug":"/developerguide/8-api/oauth","title":"/webconsole - oauth"}}},{"node":{"fields":{"slug":"/developerguide/8-api/organization","title":"/webconsole - organization"}}},{"node":{"fields":{"slug":"/developerguide/8-api/page-template","title":"/webconsole - page-template"}}},{"node":{"fields":{"slug":"/developerguide/8-api/policy","title":"/webconsole - policy"}}},{"node":{"fields":{"slug":"/developerguide/8-api/property-value","title":"/webconsole - property-value"}}},{"node":{"fields":{"slug":"/developerguide/8-api/report","title":"/webconsole - report"}}},{"node":{"fields":{"slug":"/developerguide/8-api/resource-type","title":"/webconsole - resource-type"}}},{"node":{"fields":{"slug":"/developerguide/8-api/resource","title":"/webconsole - resource"}}},{"node":{"fields":{"slug":"/developerguide/8-api/role","title":"/webconsole - role"}}},{"node":{"fields":{"slug":"/developerguide/8-api/sync-config","title":"/webconsole - sync-config"}}},{"node":{"fields":{"slug":"/developerguide/8-api/sync-rest","title":"/webconsole - sync-rest"}}},{"node":{"fields":{"slug":"/developerguide/8-api/user","title":"/webconsole - user"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/1-autoprov","title":"Automated provisioning Scripts"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/2-import","title":"Import from application"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/4-relations-with-manager","title":"Populating a manager"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/3-importing_groups","title":"Importing groups from application"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/2-selfservice/1-forgotpassword","title":"Forgot password"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/2-selfservice/2-updateprofile","title":"Updating user profile"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/2-selfservice/3-changepassword","title":"Updating your password"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/2-selfservice/5-forgotusername","title":"Forgot username"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/2-selfservice/6-updatesecquestions","title":"Updating security questions"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/2-selfservice/4-outofoffice","title":"Out of office assistant"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/1-servicecatalog","title":"Requesting access via catalog"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/10-positionchange","title":"Position change request"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/11-accessprofiles","title":"Access profiles"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/12-bulkupload","title":"Uploading users in bulk"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/2-jobprofile","title":"Requesting access from profile"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/5-approverequest","title":"Approving requests"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/6-requestadministration","title":"Request administration"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/7-requesthistory","title":"Requests history"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/8-newgroup","title":"Creating a group request"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/4-createrequest/9-newuser","title":"Creating a new user"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/7-useraccess/1-viewmyaccess","title":"View my access"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/7-useraccess/2-directreports","title":"View direct reports"}}},{"node":{"fields":{"slug":"/end-user-guide-for-selfservice/7-useraccess/3-UAR-in-Self-Service","title":"User access review module in SelfService"}}},{"node":{"fields":{"slug":"/developerguide/8-api/uri-pattern","title":"/webconsole - uri-pattern"}}},{"node":{"fields":{"slug":"/developerguide/8-api/ui-theme","title":"/webconsole - ui-theme"}}},{"node":{"fields":{"slug":"/developerguide/8-api/system","title":"/webconsole - system"}}},{"node":{"fields":{"slug":"/getting-started/31-planning-workforce/1-designrole","title":"Designing business roles"}}},{"node":{"fields":{"slug":"/getting-started/31-planning-workforce/2-openiam-access-role","title":"Designing access roles"}}},{"node":{"fields":{"slug":"/getting-started/31-planning-workforce/3-connector-planning","title":"Connector requirements"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/1-connect","title":"Deploying and registering connectors"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/2-importentitlements","title":"Importing entitlements"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/3-importusers-and-entitlements","title":"Importing users and their entitlement memberships"}}},{"node":{"fields":{"slug":"/getting-started/6-automatedprovisioning/1-jml","title":"Joiners, movers, leavers processes"}}},{"node":{"fields":{"slug":"/getting-started/6-automatedprovisioning/2-tutorial","title":"Automated provisioning tutorial"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/1-singlenode","title":"Single VM Install"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/10-ha-rpm","title":"High availability (HA) deployment using RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/11-configuration-options","title":"Configuration options in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/2-rproxy","title":"r-Proxy installation in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/4-backup","title":"RPM backup / recovery"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/5-ports","title":"Deployment architecture in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-migrating-non-production-to-production-environment","title":"Migrating non-production to production environment in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading","title":"Upgrading OpenIAM in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/7-remoteDB","title":"Installing OpenIAM with a remote database in RPM environment"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/8-ssl","title":"Configuring HTTPS in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/9-rabbitssl","title":"Enable TLS for RabbitMQ in RPM"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/1-https","title":"Configuring HTTPS on Docker"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/2-Configuration-options","title":"Configuration options in Docker"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/3-upgrading","title":"Upgrading OpenIAM in Docker environment"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/4-YAML-files","title":"Docker YAML files"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/5-docker-swarm-backup","title":"Backup / restore in Docker Swarm"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/6-externalDB","title":"Installing OpenIAM with a remote database in Docker"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/1-ssl","title":"Configuring HTTPS in Kubernetes"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/11-common-scenario","title":"Installing OpenIAM in Kubernetes environment"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/12-vault-migration-fromRPM-toK8","title":"Migration of Vault from RPM-based cluster to Kubernetes-based OpenIAM cluster"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/2-deployment-with-terraform","title":"Deploying OpenIAM with Terraform"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/3-depl-without-terraform","title":"Deploying OpenIAM on Kubernetes using Helm"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/4-RabbitMQ-TLS","title":"RabbitMQ TLS directory in Kubernetes"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/5-upgrading","title":"Upgrading OpenIAM in Kubernetes environment"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/6-k8platforms","title":"Kubernetes Platforms"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/7-useal-keys-restoration","title":"Backing up and restoring the vault unseal keys in Kubernetes"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/8-AKS_with_ext_MSSQL","title":"Deploying OpenIAM on AKS (Kubernetes) with an external MSSQL database"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/9-remoteDB","title":"Installing OpenIAM with a remote database in Kubernetes environment"}}},{"node":{"fields":{"slug":"/installation/8-sizing/1-small-k8","title":"Small Enterprise - K8"}}},{"node":{"fields":{"slug":"/installation/8-sizing/2-medium-k8","title":"Medium Enterprise - K8"}}},{"node":{"fields":{"slug":"/installation/7-OpenShift-installation/1-create-cluster","title":"Creating an OpenShift cluster on Azure"}}},{"node":{"fields":{"slug":"/installation/7-OpenShift-installation/2-connect-to-cluster","title":"Connect to OpenShift cluster on Azure"}}},{"node":{"fields":{"slug":"/installation/7-OpenShift-installation/3-deploy-OpenIAM-helm","title":"Deploy OpenIAM to OpenShift cluster with Helm"}}},{"node":{"fields":{"slug":"/installation/7-OpenShift-installation/4-some-descriptions-helm","title":"Memory requirements for OpenShift deployment with Helm"}}},{"node":{"fields":{"slug":"/installation/7-OpenShift-installation/5-localhost-dev-cluster","title":"Localhost development cluster"}}},{"node":{"fields":{"slug":"/installation/7-OpenShift-installation/6-deploy-from-windows","title":"Deploy OpenIAM to OpenShift cluster with Helm (from Windows)"}}},{"node":{"fields":{"slug":"/installation/9-data_migration/1-migrating_ES_Docker","title":"Verifying and migrating Elasticsearch data in Docker-based OpenIAM cluster"}}},{"node":{"fields":{"slug":"/installation/9-miscellaneous/01-log4j","title":"Log4j Vulnerability"}}},{"node":{"fields":{"slug":"/installation/9-miscellaneous/02-hardening","title":"Securing your installation"}}},{"node":{"fields":{"slug":"/installation/9-miscellaneous/03-db-switch","title":"Change OpenIAM product database"}}},{"node":{"fields":{"slug":"/installation/9-miscellaneous/04-compatibility","title":"Compatibility matrix"}}},{"node":{"fields":{"slug":"/installation/9-miscellaneous/05-postgres-install","title":"Installing PostgreSQL 15"}}},{"node":{"fields":{"slug":"/installation/99-miscellaneous/04-compatibility","title":"Compatibility Matrix"}}},{"node":{"fields":{"slug":"/troubleshooting/cluster/1-rabbitmq-reinit","title":"RabbitMQ cluster went out of order"}}},{"node":{"fields":{"slug":"/troubleshooting/cluster/2-rabbitmq-UI","title":"RabbitMQ is not reached from UI in RPM installations"}}},{"node":{"fields":{"slug":"/troubleshooting/cluster/3-Rabbitmq-connection-timeout","title":"RabbitMQ  connection timeout issue"}}},{"node":{"fields":{"slug":"/troubleshooting/connectors/sync-vs-async-source","title":"Synchronous vs. asynchronous synchronization source for connectors"}}},{"node":{"fields":{"slug":"/troubleshooting/docker/1-connectorlogs","title":"View container logs"}}},{"node":{"fields":{"slug":"/troubleshooting/docker/2-containersrestart","title":"Containers Restarting"}}},{"node":{"fields":{"slug":"/troubleshooting/docker/3-uninstall","title":"Remove an OpenIAM Docker Install"}}},{"node":{"fields":{"slug":"/troubleshooting/docker/5-log-checking-guide","title":"Docker log checking guide"}}},{"node":{"fields":{"slug":"/troubleshooting/docker/4-troubleshooting-steps","title":"Troubleshooting steps in a container-based cluster"}}},{"node":{"fields":{"slug":"/troubleshooting/environment/memoryutili","title":"Check memory utilization"}}},{"node":{"fields":{"slug":"/troubleshooting/environment/disableswap","title":"Disable swap"}}},{"node":{"fields":{"slug":"/troubleshooting/environment/redismemory","title":"Redis memory utilization"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/422-changes","title":"Known issues related to updating OpenIAM from 4.2.1.x versions to the newest 4.2.2 version"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/JDBC-connection-pool","title":"Increasing the JDBC connection pool size"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/access-after-migration","title":"Access problem after migrating OpenIAM"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/access-forbidden","title":"Access Forbidden error"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/activationlink","title":"Error when sending activation link"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/audit-doc-timestamp","title":"Audit document timestamp issue"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/database-reset","title":"Database reset"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/auth-manager","title":"Backend exception error when running authentication manager"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/debug-logs-CassandraJanusGraph","title":"Enabling and disabling debug logs for Cassandra and JanusGraph"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/elasticsearch-readonly-state","title":"Elasticsearch read-only state"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/flyway_version","title":"Flyway version issue"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/increasing-RAM","title":"Increasing memory for OpenIAM services"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/lackof_disk_space","title":"Running out of disk space"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/modifly_system_labels_and_messages","title":"Changing system labels and messages"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/my-application-page-selfservice","title":"Changing refresh time for My Applications page in SelfService"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/overriding-app-properties","title":"Overriding UI application properties"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/pad-block-corrupted","title":"PAD Block Corrupted"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/remove-navigation-bar","title":"Removing menu items from top navigation bar"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/report-generation-issue","title":"Error during report generating in RPM installations"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/run_flyway_repair_mode","title":"Run Flyway in repair mode"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/resetting_passwords","title":"Resetting passwords"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/unlocksysadmin","title":"Unlock sysadmin"}}},{"node":{"fields":{"slug":"/troubleshooting/operational/username_in_selfservice","title":"Username not shown in SelfService"}}},{"node":{"fields":{"slug":"/troubleshooting/rpm/failed-dependencies","title":"Failed dependencies"}}},{"node":{"fields":{"slug":"/troubleshooting/rpm/trobleshooting_guide","title":"Troubleshooting guide for RPM"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/4-pageconfiguration/1-userpage","title":"Configuring user page templates"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/4-pageconfiguration/2-customuserpage","title":"Creating more custom user edit pages"}}},{"node":{"fields":{"slug":"/admin/1-usradmin/4-pageconfiguration/4-customtemplates","title":"Custom form templates"}}},{"node":{"fields":{"slug":"/admin/12-administration/1-sysconfig/1-system","title":"System tab"}}},{"node":{"fields":{"slug":"/admin/12-administration/1-sysconfig/3-UI","title":"UI tab"}}},{"node":{"fields":{"slug":"/admin/12-administration/1-sysconfig/4-workflow","title":"Workflow tab"}}},{"node":{"fields":{"slug":"/admin/12-administration/1-sysconfig/5-organization-tab","title":"Organization tab"}}},{"node":{"fields":{"slug":"/admin/12-administration/1-sysconfig/6-password","title":"Password tab"}}},{"node":{"fields":{"slug":"/admin/12-administration/1-sysconfig/7-authentication","title":"Authentication tab"}}},{"node":{"fields":{"slug":"/admin/12-administration/1-sysconfig/8-auditeventstosyslog","title":"Exporting Audit Events to Syslogs"}}},{"node":{"fields":{"slug":"/admin/12-administration/2-mail-management/1-emailtemplates","title":"Email templates"}}},{"node":{"fields":{"slug":"/admin/12-administration/2-mail-management/2-smtpconfig","title":"Mailbox Configuration"}}},{"node":{"fields":{"slug":"/admin/12-administration/2-mail-management/3-multilanguagemail","title":"Multilanguage emails"}}},{"node":{"fields":{"slug":"/admin/12-administration/2-mail-management/4-mail-via-azure","title":"Mailbox configuration via Azure application"}}},{"node":{"fields":{"slug":"/admin/12-administration/2-mail-management/5-alert-notifications","title":"Configuring alert notifications"}}},{"node":{"fields":{"slug":"/admin/2-authentication/8-social/1-googlesociallogin","title":"Google Social Login"}}},{"node":{"fields":{"slug":"/admin/2-authentication/8-social/2-facebooksociallogin","title":"Facebook Social Login"}}},{"node":{"fields":{"slug":"/admin/2-authentication/8-social/3-linkedinsociallogin","title":"LinkedIn Social Login"}}},{"node":{"fields":{"slug":"/admin/2-authentication/8-social/4-appleidsociallogin","title":"AppleID Social Login"}}},{"node":{"fields":{"slug":"/admin/3-authz/14-menus/1-enduseraccess","title":"End-user access roles"}}},{"node":{"fields":{"slug":"/admin/3-authz/14-menus/2-adminaccess","title":"Admin access role"}}},{"node":{"fields":{"slug":"/admin/3-authz/14-menus/3-FAQ","title":"FAQs about menus and their use"}}},{"node":{"fields":{"slug":"/admin/3-authz/2-roles/2-createrole","title":"Create role"}}},{"node":{"fields":{"slug":"/admin/3-authz/2-roles/3-findrole","title":"Finding an existing role"}}},{"node":{"fields":{"slug":"/admin/3-authz/2-roles/5-importingroles","title":"Importing roles"}}},{"node":{"fields":{"slug":"/admin/3-authz/3-groups/1-create-group","title":"Creating a group"}}},{"node":{"fields":{"slug":"/admin/4-app-onboarding/2-Manual-applications/1-reg-applications","title":"Register applications"}}},{"node":{"fields":{"slug":"/admin/5-lifecycle/11-provisioning-config/1-prepost-processor","title":"Pre/PostProcessor"}}},{"node":{"fields":{"slug":"/admin/8-sso/1-saml/1-jit-provisioning","title":"Just-in-time Provisioning"}}},{"node":{"fields":{"slug":"/admin/8-sso/2-oauth2/1-Auth-code-grand","title":"Authorization code grant type"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/10-winlocal/2-winlocalv5","title":"Version 5"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/10-winlocal/1-winlocalv4","title":"Version 4"}}},{"node":{"fields":{"slug":"/developerguide/2-api/1-postman/1-createauthprovider","title":"Create OpenIAM Provider for Postman"}}},{"node":{"fields":{"slug":"/developerguide/2-api/1-postman/2-postmanconfig","title":"Create Postman collection"}}},{"node":{"fields":{"slug":"/developerguide/2-api/1-postman/3-add-request","title":"Define an API request in Postman"}}},{"node":{"fields":{"slug":"/developerguide/2-api/1-postman/6-example","title":"Client credentials flow with a defined scope in Postman"}}},{"node":{"fields":{"slug":"/developerguide/2-api/1-postman/5-postman-links","title":"Postman API documentation links"}}},{"node":{"fields":{"slug":"/developerguide/2-api/2-python/1-createauthprovider","title":"Create OpenIAM oAuth provider in Python"}}},{"node":{"fields":{"slug":"/developerguide/2-api/2-python/2-grantinguathz","title":"Granting authorization to the API with Python"}}},{"node":{"fields":{"slug":"/developerguide/2-api/2-python/3-api-call-examples","title":"API calls examples in Python"}}},{"node":{"fields":{"slug":"/developerguide/2-api/2-python/4-enabling-disabling-user","title":"Enabling/Disabling a user with API calls examples in Python"}}},{"node":{"fields":{"slug":"/developerguide/2-api/2-python/5-object-oriented-impl-example","title":"Object oriented implementation for REST API in Python"}}},{"node":{"fields":{"slug":"/developerguide/2-api/2-python/6-OTP-verification","title":"OTP Verification in Python"}}},{"node":{"fields":{"slug":"/developerguide/2-api/3-java/1-createauthprovider","title":"Create OpenIAM Provider"}}},{"node":{"fields":{"slug":"/developerguide/2-api/3-java/2-grantauthz","title":"Granting authorization to the API with Java"}}},{"node":{"fields":{"slug":"/developerguide/2-api/3-java/3-creating-searching-users","title":"Creating and searching a user with API call in Java"}}},{"node":{"fields":{"slug":"/developerguide/2-api/3-java/4-calls-examples","title":"API calls examples in Java"}}},{"node":{"fields":{"slug":"/developerguide/2-api/3-java/5-enabling-disabling-users","title":"Enabling/Disabling a user with API calls examples in Java"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/2-import/3-azuread","title":"Entra ID"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/1-autoprov/1-newhires","title":"New hires"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/2-import/6-importroles","title":"Import Roles"}}},{"node":{"fields":{"slug":"/developerguide/2-api/1-postman/4-JWT-tokens","title":"Getting started with JWT tokens in Postman"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/1-connect/3-docker","title":" Connectors via Docker"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/1-connect/4-k8","title":" Connectors via Kubernetes"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/2-importentitlements/2-transformationscripts","title":"Transformation scripts"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/2-importentitlements/3-troubleshooting","title":"Troubleshooting"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/2-importentitlements/1-configuring-synch","title":"Configuring synchronization for importing entitlements"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/3-importusers-and-entitlements/1-config-synch","title":"Configuring synchronization for importing users and their entitlement memberships"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/3-importusers-and-entitlements/2-transformationscripts","title":"Transformation scripts"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/3-importusers-and-entitlements/3-common-questions","title":"Common questions"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/1-connect/2-rpm","title":"Connectors via RPM"}}},{"node":{"fields":{"slug":"/getting-started/6-automatedprovisioning/2-tutorial/2-policymap","title":"Policy map"}}},{"node":{"fields":{"slug":"/getting-started/6-automatedprovisioning/2-tutorial/1-provisioningCSV","title":"Creating a synchronization configuration for the source"}}},{"node":{"fields":{"slug":"/getting-started/6-automatedprovisioning/2-tutorial/4-birthright","title":"New hire"}}},{"node":{"fields":{"slug":"/getting-started/6-automatedprovisioning/2-tutorial/5-transfer","title":"Transfer"}}},{"node":{"fields":{"slug":"/getting-started/6-automatedprovisioning/2-tutorial/6-termination","title":"Terminations"}}},{"node":{"fields":{"slug":"/getting-started/6-automatedprovisioning/2-tutorial/3-creatingrole","title":"Creating role"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/1-singlenode/3-nonroot-partition","title":"Installing OpenIAM on a non-root partition"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/1-singlenode/1-rpm-with-internet","title":"Installation with Internet access"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/5-ports/1-one-node","title":"Single node deployment"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/1-singlenode/2-rpm-no-internet","title":"Installation without Internet access"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/5-ports/2-three-node","title":"Three node cluster"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/1-databasemigration","title":"Database migration from version 3.X to 4.X"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/2-upgradingto-42110","title":"Upgrading from version 4.2.1.5-4.2-4.2.1.8 to version 4.2.1.10 in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/3-upgradingto-42111","title":"Upgrading from versions 4.2.1.9-4.2.1.10 to version 4.2.1.11 in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/4-migrating-index-data","title":"Migration of index data from older ElasticSearch versions to newer one"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/5-infrastructure_upgrade","title":"Infrastructure upgrade"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/4-upgradingto-42112","title":"Upgrading from versions 4.2.1.x to version 4.2.1.12 in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/5-upgradingto-42115","title":"Upgrading from versions 4.2.1.x to version 4.2.1.15 in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/6-infra-upgrade-42113","title":"Infrastructure upgrade in v4.2.1.13"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/7-upgradingto-422","title":"Upgrading OpenIAM from versions 4.2.1.x to 4.2.2 in RPM"}}},{"node":{"fields":{"slug":"/installation/1-rpm-installation/6-upgrading/8-upgrading-2026-2-1","title":"Upgrading OpenIAM to v.2026.2.1 in RPM"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/3-upgrading/1-upgrade-4219","title":"Upgrade from version 4.2.1.5-4.2.1.8 to version 4.2.1.10 in Docker"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/3-upgrading/2-upgrade-42110","title":"Upgrade from version 4.2.1.9 to version 4.2.1.10 in Docker"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/3-upgrading/3-upgrade-42111","title":"Upgrade from version 4.2.1.10 to version 4.2.1.11 in Docker"}}},{"node":{"fields":{"slug":"/installation/2-docker-installation/3-upgrading/4-upgrade-42115","title":"Upgrade from version 4.2.1.x to version 4.2.1.15 in Docker"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/5-upgrading/3-upgrade-42113k8-rabbitmq","title":"Upgrading from version below 4.2.1.8 to version 4.2.1.13 in Kubernetes environment"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/5-upgrading/4-upgrade-42115k8","title":"Upgrading from versions 4.2.1.x to version 4.2.1.15 in Kubernetes environment"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/5-upgrading/5-upgrade-42112k8","title":"Upgrading from version 4.2.1.x to version 4.2.1.12 in Kubernetes environment"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/6-k8platforms/1-gce","title":"GCE Kubernetes guide"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/6-k8platforms/2-aws","title":"AWS Kubernetes guide"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/6-k8platforms/3-helm","title":"Private Kubernetes Cluster using Helm"}}},{"node":{"fields":{"slug":"/installation/6-kubernetes-installation/6-k8platforms/4-azure","title":"Azure Kubernetes Guide"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/2-import/ldap/1-ldapvalidation","title":"Synchronization Validation Script"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/2-import/ldap/2-ldapsynchusers","title":"LDAP User Synchronization Script"}}},{"node":{"fields":{"slug":"/developerguide/9-synchronization/2-import/ldap/3-ldapattributeslists","title":"LDAP Attribute list for User Synchronization"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/2-importentitlements/2-transformationscripts/1-ADgroup-transformation","title":"Sample transformation script for AD groups"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/2-importentitlements/2-transformationscripts/2-csv-transformation","title":"Sample transformation script for a CSV file"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/3-importusers-and-entitlements/2-transformationscripts/3-ADtransformation-usergroup","title":"Sample transformation script for AD users and group memberships"}}},{"node":{"fields":{"slug":"/getting-started/4-application-onboarding/3-importusers-and-entitlements/2-transformationscripts/4-csv-users-entitlements","title":"Sample transformation script for a CSV file"}}},{"node":{"fields":{"slug":"/changelog/21-Release-4.2.2","title":"Release 4.2.2"}}},{"node":{"fields":{"slug":"/connectorconfig/microsoft/4-adpowershell","title":"Active Directory PowerShell connector"}}},{"node":{"fields":{"slug":"/appendix/5-message_en_file","title":"Message properties"}}}]}},"pageContext":{"id":"0903c34f-6cba-5af6-824a-bee3971e10a6"}},
    "staticQueryHashes": ["2619113677","3706406642","417421954"]}