Short intro: here you can find answer to FAQ about how to initiate resource provisioning via Requests and Java application.
Q: Мне необходимо инициировать предоставление ресурса в OIM 11gPS1 программным способом, как лучше это сделать?
A: Удобный способ это сделать – создать запрос на предоставление ресурса и автоматически его согласовать через опцию Auto Approval. OIM 11gPS1 обладает обновленным интерфейсом работы с запросами. Пример, как с ним работать, приведен ниже.
1. Создаете Request Dataset наподобие вот такого (пример) и загрузите его в метаданные OIM.
2. Создаете Request Template, типа – Provision Resource, ресурс – ваш ресурс (Lab14 Resource в моем случае).
3. Используйте класс OIMClient (см. следующий Java код) для установления соединения с OIM:
String oimURL = "t3://10.162.68.87:14000/oim";
String oimInitialContextFactory = "weblogic.jndi.WLInitialContextFactory";
System.setProperty("java.security.auth.login.config", "C:/lib/security/config/authwl.conf");
// set up the environment for making the OIM API invocation
Hashtable env = new Hashtable();
env.put(oracle.iam.platform.OIMClient.JAVA_NAMING_FACTORY_INITIAL, oimInitialContextFactory);
env.put(oracle.iam.platform.OIMClient.JAVA_NAMING_PROVIDER_URL, oimURL);
OIMClient oimClient = new OIMClient(env);
System.out.println("oimClient: " + oimClient);
try {
oimClient.login("XELSYSADM", "Password".toCharArray());
System.out.println("Logged in as XELSYSADM");
} catch (LoginException e) {
e.printStackTrace();
}
4. Используйте UserManager (новый API для работы с пользователями), чтобы найти USR_KEY, в случае, если известен только имя пользователя, кому необходимо предоставить ресурс.
UserManager userMgr = oimClient.getService(UserManager.class);
Set<String> userRetAttrs = new HashSet<String>();
SearchCriteria criteria = new SearchCriteria("User Login", "TESTUSER1", SearchCriteria.Operator.EQUAL);
userRetAttrs.add(USER_LOGIN.getId());
userRetAttrs.add(USER_KEY.getId());
List<User> users = userMgr.search(criteria, userRetAttrs, null);
userKey = Long.toString((Long)attrs.get(USER_KEY.getId()));
System.out.println("User Key = " + userKey);
5. Используйте RequestService для создания запроса, как показано в коде ниже.
RequestService reqSvc = oimClient.getService(RequestService.class);
String templateName = "Lab14 Resource Provision"; // имя Request Template
RequestData requestData = new RequestData(templateName);
requestData.setJustification("I need this");
Beneficiary beneficiary = new Beneficiary(); // кому выделить ресурс
beneficiary.setBeneficiaryType("user");
beneficiary.setBeneficiaryKey(userKey);
List<RequestBeneficiaryEntity> entities = new ArrayList<RequestBeneficiaryEntity>();
List<RequestBeneficiaryEntityAttribute> entityAttrList = new ArrayList<RequestBeneficiaryEntityAttribute>();
// заполняем Request Dataset
entityAttrList.add(this.getAttr("UserName", "TestUser1"));
entityAttrList.add(this.getAttr("UserPassword", "abcd1234"));
entityAttrList.add(this.getAttr("FirstName", "Test"));
entityAttrList.add(this.getAttr("LastName", "User1"));
entityAttrList.add(this.getAttr("Department", "Department #1"));
entityAttrList.add(this.getAttr("Position", "Leader"));
entityAttrList.add(this.getAttr("Location", "Kosmos"));
String resName = "Lab14 Resource"; // название Resource Object'а
RequestBeneficiaryEntity entity = new RequestBeneficiaryEntity();
entity.setEntityType(RequestConstants.RESOURCE);
entity.setEntityKey(getResourceKey(resName));
entity.setEntitySubType(resName);
entity.setEntityData(entityAttrList);
entities.add(entity);
beneficiary.setTargetEntities(entities);
List<Beneficiary> beneficiaries = new ArrayList<Beneficiary>();
beneficiaries.add(beneficiary);
requestData.setBeneficiaries(beneficiaries);
String reqNo = reqSvc.submitRequest(requestData);
System.out.println("Request #" + reqNo + " submitted");
6. Используйте традиционный API OIM для поиска ключа ресурса.
private String getResourceKey(String resName) throws Exception {
tcObjectOperationsIntf objOps = oimClient.getService(tcObjectOperationsIntf.class);
Hashtable ht = new Hashtable();
ht.put("Objects.Name", resName);
tcResultSet rs = objOps.findObjects(ht);
rs.goToRow(0);
String objKey = rs.getStringValue("Objects.Key");
System.out.println("Role Key found for role " + resName + ": " + objKey);
return objKey;
}
7. Укажите в Design Console для формы процесса вашего ресурса Auto Save, адаптерами презаполнения полей настройте автоматическое заполнение недостающих атрибутов (IT Resource etc).
8. Создайте Approval Policies для запроса типа Provision Resource с правилами, указывающими на ваш ранее созданный шаблон запроса. Укажите Auto Approve для политики уровней Request Level и Operation Level.
Все готово.
Сам класс можно взять здесь: Requester.java
p.s. при запуске из JDeveloper 11.1.1.5 выдавал ошибку неверного метода OIMClient.logon:
Exception in thread "main" java.lang.NoSuchMethodError: Thor.API.Security.LoginHandler.LoginHandler.login(Ljava/util/Hashtable;Ljava/lang/String;[C)LThor/API/Security/LoginHandler/LoginSession;
at oracle.iam.platform.OIMClient.login(OIMClient.java:134)
Но из командной строки работает нормально...
Q: Мне необходимо инициировать предоставление ресурса в OIM 11gPS1 программным способом, как лучше это сделать?
A: Удобный способ это сделать – создать запрос на предоставление ресурса и автоматически его согласовать через опцию Auto Approval. OIM 11gPS1 обладает обновленным интерфейсом работы с запросами. Пример, как с ним работать, приведен ниже.
1. Создаете Request Dataset наподобие вот такого (пример) и загрузите его в метаданные OIM.
2. Создаете Request Template, типа – Provision Resource, ресурс – ваш ресурс (Lab14 Resource в моем случае).
3. Используйте класс OIMClient (см. следующий Java код) для установления соединения с OIM:
String oimURL = "t3://10.162.68.87:14000/oim";
String oimInitialContextFactory = "weblogic.jndi.WLInitialContextFactory";
System.setProperty("java.security.auth.login.config", "C:/lib/security/config/authwl.conf");
// set up the environment for making the OIM API invocation
Hashtable env = new Hashtable();
env.put(oracle.iam.platform.OIMClient.JAVA_NAMING_FACTORY_INITIAL, oimInitialContextFactory);
env.put(oracle.iam.platform.OIMClient.JAVA_NAMING_PROVIDER_URL, oimURL);
OIMClient oimClient = new OIMClient(env);
System.out.println("oimClient: " + oimClient);
try {
oimClient.login("XELSYSADM", "Password".toCharArray());
System.out.println("Logged in as XELSYSADM");
} catch (LoginException e) {
e.printStackTrace();
}
4. Используйте UserManager (новый API для работы с пользователями), чтобы найти USR_KEY, в случае, если известен только имя пользователя, кому необходимо предоставить ресурс.
UserManager userMgr = oimClient.getService(UserManager.class);
Set<String> userRetAttrs = new HashSet<String>();
SearchCriteria criteria = new SearchCriteria("User Login", "TESTUSER1", SearchCriteria.Operator.EQUAL);
userRetAttrs.add(USER_LOGIN.getId());
userRetAttrs.add(USER_KEY.getId());
List<User> users = userMgr.search(criteria, userRetAttrs, null);
userKey = Long.toString((Long)attrs.get(USER_KEY.getId()));
System.out.println("User Key = " + userKey);
5. Используйте RequestService для создания запроса, как показано в коде ниже.
RequestService reqSvc = oimClient.getService(RequestService.class);
String templateName = "Lab14 Resource Provision"; // имя Request Template
RequestData requestData = new RequestData(templateName);
requestData.setJustification("I need this");
Beneficiary beneficiary = new Beneficiary(); // кому выделить ресурс
beneficiary.setBeneficiaryType("user");
beneficiary.setBeneficiaryKey(userKey);
List<RequestBeneficiaryEntity> entities = new ArrayList<RequestBeneficiaryEntity>();
List<RequestBeneficiaryEntityAttribute> entityAttrList = new ArrayList<RequestBeneficiaryEntityAttribute>();
// заполняем Request Dataset
entityAttrList.add(this.getAttr("UserName", "TestUser1"));
entityAttrList.add(this.getAttr("UserPassword", "abcd1234"));
entityAttrList.add(this.getAttr("FirstName", "Test"));
entityAttrList.add(this.getAttr("LastName", "User1"));
entityAttrList.add(this.getAttr("Department", "Department #1"));
entityAttrList.add(this.getAttr("Position", "Leader"));
entityAttrList.add(this.getAttr("Location", "Kosmos"));
String resName = "Lab14 Resource"; // название Resource Object'а
RequestBeneficiaryEntity entity = new RequestBeneficiaryEntity();
entity.setEntityType(RequestConstants.RESOURCE);
entity.setEntityKey(getResourceKey(resName));
entity.setEntitySubType(resName);
entity.setEntityData(entityAttrList);
entities.add(entity);
beneficiary.setTargetEntities(entities);
List<Beneficiary> beneficiaries = new ArrayList<Beneficiary>();
beneficiaries.add(beneficiary);
requestData.setBeneficiaries(beneficiaries);
String reqNo = reqSvc.submitRequest(requestData);
System.out.println("Request #" + reqNo + " submitted");
6. Используйте традиционный API OIM для поиска ключа ресурса.
private String getResourceKey(String resName) throws Exception {
tcObjectOperationsIntf objOps = oimClient.getService(tcObjectOperationsIntf.class);
Hashtable ht = new Hashtable();
ht.put("Objects.Name", resName);
tcResultSet rs = objOps.findObjects(ht);
rs.goToRow(0);
String objKey = rs.getStringValue("Objects.Key");
System.out.println("Role Key found for role " + resName + ": " + objKey);
return objKey;
}
7. Укажите в Design Console для формы процесса вашего ресурса Auto Save, адаптерами презаполнения полей настройте автоматическое заполнение недостающих атрибутов (IT Resource etc).
8. Создайте Approval Policies для запроса типа Provision Resource с правилами, указывающими на ваш ранее созданный шаблон запроса. Укажите Auto Approve для политики уровней Request Level и Operation Level.
Все готово.
Сам класс можно взять здесь: Requester.java
p.s. при запуске из JDeveloper 11.1.1.5 выдавал ошибку неверного метода OIMClient.logon:
Exception in thread "main" java.lang.NoSuchMethodError: Thor.API.Security.LoginHandler.LoginHandler.login(Ljava/util/Hashtable;Ljava/lang/String;[C)LThor/API/Security/LoginHandler/LoginSession;
at oracle.iam.platform.OIMClient.login(OIMClient.java:134)
Но из командной строки работает нормально...
No comments:
Post a Comment