Monday, May 25, 2015

OIM API: Provisioning Resource Account to User

Tested On: Oracle Identity Manager 11.1.2.2.0
Description: A utility to provision a resource account to an OIM User. The parent data and the child data can be provided to populate the process forms associated with the application instance.

Results of executing code
Reference: http://docs.oracle.com/cd/E40329_01/apirefs.1112/e28159/toc.htm

package com.blogspot.oraclestack.testdriver;
import com.blogspot.oraclestack.utilities.ProvisioningUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import oracle.core.ojdl.logging.ODLLogger;
import oracle.iam.platform.OIMClient;
import oracle.iam.provisioning.vo.ChildTableRecord.ACTION;
import oracle.iam.provisioning.vo.ChildTableRecord;
/**
* Test Driver fro Provisioning Utilities
* @author rayedchan
*/
public class ProvisioningTestDriver
{
// Logger
private static final ODLLogger logger = ODLLogger.getODLLogger(ProvisioningTestDriver.class.getName());
// Adjust constant variables according to you OIM environment
public static final String OIM_HOSTNAME = "localhost";
public static final String OIM_PORT = "14000"; // For SSL, use 14001; For non-SSL, use 14000
public static final String OIM_PROVIDER_URL = "t3://"+ OIM_HOSTNAME + ":" + OIM_PORT; // For SSL, use t3s protocol; For non-SSL, use t3 protocol
public static final String AUTHWL_PATH = "lib/config/authwl.conf";
public static final String APPSERVER_TYPE = "wls";
public static final String FACTORY_INITIAL_TYPE = "weblogic.jndi.WLInitialContextFactory";
public static final String OIM_ADMIN_USERNAME = "xelsysadm";
public static final String OIM_ADMIN_PASSWORD = "Password1";
public static void main(String[] args) throws Exception
{
OIMClient oimClient = null;
try
{
// Set system properties required for OIMClient
System.setProperty("java.security.auth.login.config", AUTHWL_PATH);
System.setProperty("APPSERVER_TYPE", APPSERVER_TYPE);
// Create an instance of OIMClient with OIM environment information
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(OIMClient.JAVA_NAMING_FACTORY_INITIAL, FACTORY_INITIAL_TYPE);
env.put(OIMClient.JAVA_NAMING_PROVIDER_URL, OIM_PROVIDER_URL);
// Establish an OIM Client
oimClient = new OIMClient(env);
// Login to OIM with System Administrator Credentials
oimClient.login(OIM_ADMIN_USERNAME, OIM_ADMIN_PASSWORD.toCharArray());
// Instaniate custom utility
ProvisioningUtils provUtils = new ProvisioningUtils(oimClient);
String userLogin = "TSWIFT"; // TODO: Change this with your user
String appInstName = "DBATUser"; // TODO: Change this with application name
String CHILD_PROCESS_FORM_NAME = "UD_DBATRO"; // TODO: Change with child process form name
String CHILD_ATTRIBUTE_NAME = "UD_DBATRO_ROLE"; // TODO: Change with child attribute name
// ==========================================
// Data to populate the parent process form
// ==========================================
Map<String,Object> parentData = new HashMap<String,Object>();
parentData.put("UD_DBATUSR_FIRST_NAME", "Taylor");
parentData.put("UD_DBATUSR_MIDDLE_NAME", "Alison");
parentData.put("UD_DBATUSR_LAST_NAME", "Swift");
parentData.put("UD_DBATUSR_USER_ID", "TSWIFT");
parentData.put("UD_DBATUSR_UNIQUE_ID", "TSWIFT");
parentData.put("UD_DBATUSR_TITLE", "Celebrity");
// ==========================================
// Data to populate the child form
// ==========================================
Map<String, ArrayList<ChildTableRecord>> childData = new HashMap<String, ArrayList<ChildTableRecord>>();
ArrayList<ChildTableRecord> modRecords = new ArrayList<ChildTableRecord>();
// First child record
HashMap<String,Object> addRecordData = new HashMap<String,Object>();
addRecordData.put(CHILD_ATTRIBUTE_NAME, "Singer");
ChildTableRecord addRecord = new ChildTableRecord();
addRecord.setAction(ACTION.Add);
addRecord.setChildData(addRecordData);
modRecords.add(addRecord);
// Second child record
HashMap<String,Object> addRecordData2 = new HashMap<String,Object>();
addRecordData2.put(CHILD_ATTRIBUTE_NAME, "Actress");
ChildTableRecord addRecord2 = new ChildTableRecord();
addRecord2.setAction(ACTION.Add);
addRecord2.setChildData(addRecordData2);
modRecords.add(addRecord2);
// Wrapper for child data provisioning
childData.put(CHILD_PROCESS_FORM_NAME, modRecords); // Put Child Form Name and its modified child data
// ==========================================
// Call custom method to provision account
// ==========================================
Long oiuKey = provUtils.provisionResourceAccountToUser(userLogin, appInstName, parentData, childData);
System.out.println(oiuKey);
}
finally
{
if( oimClient != null)
{
oimClient.logout();
}
}
}
}
package com.blogspot.oraclestack.utilities;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
import oracle.core.ojdl.logging.ODLLevel;
import oracle.core.ojdl.logging.ODLLogger;
import oracle.iam.identity.exception.NoSuchUserException;
import oracle.iam.identity.exception.UserLookupException;
import oracle.iam.identity.usermgmt.api.UserManager;
import oracle.iam.identity.usermgmt.vo.User;
import oracle.iam.platform.OIMClient;
import oracle.iam.platform.authz.exception.AccessDeniedException;
import oracle.iam.provisioning.api.ApplicationInstanceService;
import oracle.iam.provisioning.api.ProvisioningService;
import oracle.iam.provisioning.exception.ApplicationInstanceNotFoundException;
import oracle.iam.provisioning.exception.GenericAppInstanceServiceException;
import oracle.iam.provisioning.exception.GenericProvisioningException;
import oracle.iam.provisioning.exception.UserNotFoundException;
import oracle.iam.provisioning.vo.Account;
import oracle.iam.provisioning.vo.AccountData;
import oracle.iam.provisioning.vo.ApplicationInstance;
import oracle.iam.provisioning.vo.ChildTableRecord;
/**
* Contains methods to provision application instances
* @author rayedchan
*/
public class ProvisioningUtils
{
// Logger
private static final ODLLogger logger = ODLLogger.getODLLogger(ProvisioningUtils.class.getName());
// Get OIM API services
private final UserManager usrMgr;
private final ApplicationInstanceService appInstService;
private final ProvisioningService provService;
/**
* Constructor
* @param oimClient OIMClient with administrator logged in
*/
public ProvisioningUtils(OIMClient oimClient)
{
this.usrMgr = oimClient.getService(UserManager.class);
this.appInstService = oimClient.getService(ApplicationInstanceService.class);
this.provService = oimClient.getService(ProvisioningService.class);
}
/**
* Provision a resource account to a user.
* @param userLogin OIM User Login (USR.USR_LOGIN)
* @param appInstName Name of application instance (APP_INSTANCE.APP_INSTANCE_NAME)
* @param parentData Data to populate the parent process form
* @param childData Data to populate the child process form(s)
* @return Account Id (OIU_KEY)
* @throws AccessDeniedException
* @throws NoSuchUserException
* @throws UserLookupException
* @throws ApplicationInstanceNotFoundException
* @throws GenericAppInstanceServiceException
* @throws UserNotFoundException
* @throws oracle.iam.platform.authopss.exception.AccessDeniedException
* @throws GenericProvisioningException
*/
public Long provisionResourceAccountToUser(String userLogin, String appInstName, Map<String,Object> parentData, Map<String, ArrayList<ChildTableRecord>> childData) throws AccessDeniedException, NoSuchUserException, UserLookupException, ApplicationInstanceNotFoundException, GenericAppInstanceServiceException, UserNotFoundException, oracle.iam.platform.authopss.exception.AccessDeniedException, GenericProvisioningException
{
// Get OIM User searching by User Login (USR.USR_LOGIN)
boolean isUserLogin = true; // True for searching by User Login; False for searching by USR_KEY
Set<String> retAttrs = null; // Return attributes; Null implies returning every attributes on user
User user = usrMgr.getDetails(userLogin, retAttrs, isUserLogin); // Get OIM User
logger.log(ODLLevel.NOTIFICATION, "User: {0}", new Object[]{user});
// Get application instance by name (APP_INSTANCE.APP_INSTANCE_NAME)
ApplicationInstance appInst = appInstService.findApplicationInstanceByName(appInstName);
logger.log(ODLLevel.NOTIFICATION, "Application Instance: {0}", new Object[]{appInst});
// Get information required provisioning resource account
String usrKey = user.getId(); // Get usr_key of OIM User
Long resourceFormKey = appInst.getAccountForm().getFormKey(); // Get Process Form Key (SDK_KEY)
logger.log(ODLLevel.NOTIFICATION, "Resource Process Form Key: {0}", new Object[]{resourceFormKey});
String udTablePrimaryKey = null;
// Construct-Stage Resource Account
AccountData accountData = new AccountData(String.valueOf(resourceFormKey), udTablePrimaryKey, parentData);
accountData.setChildData(childData);
Account resAccount = new Account(appInst, accountData);
// Provision resource account to user
Long accountId = provService.provision(usrKey, resAccount); // Account Key = OIU_KEY
logger.log(ODLLevel.NOTIFICATION, "Provisioning Account Id: {0}", new Object[]{accountId});
return accountId;
}
}

No comments:

Post a Comment