Aug 13, 2012

FAQ: как программно инициировать выделение ресурса пользователю?

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)

Но из командной строки работает нормально...




No comments:

Post a Comment