Short intro: here you can find sample solution to a commonly met task of OIM 11gR2PS3 Admin Role request & approval before assignment...
Q: Мне необходимо запрашивать и согласовывать доступ пользователей внутри OIM (назначение администраторов и т.д.), однако OIM не поддерживает запрос административных ролей, как лучше поступить?
Ответ - под катом.
Действительно, напрямую запрос административных ролей в OIM не поддерживается, однако это легко исправить при реализации плагина, автоматически назначающего административную роль при назначении роли.
Работу с административными ролями, включая создание административной роли, запрос и согласование, я постарался описать в документе:
Работа с административными ролями в OIM 11gR2PS3
Проект JDeveloper с кодом плагина.
Код самого метода плагина:
public EventResult execute(long processId, long eventId, Orchestration orchestration) {
System.out.println("\n\n======================================= project1.UserRoleHandler::EventResult execute=====\n\n");
HashMap<String, Serializable> parameters = orchestration.getParameters();
System.out.println("\n\n======================================= Parameters: " + parameters + "\n");
System.out.println("\n\n======================================= Operation: " + orchestration.getOperation() + "\n");
String roleKeyStr = (String)parameters.get("roleKey");
ArrayList userKeys = (ArrayList)parameters.get("userKeys");
String provMechanismStr = (String)parameters.get("usg_prov_mechanism");
System.out.println("roleKeyStr=" + roleKeyStr);
System.out.println("userKeys=" + userKeys);
System.out.println("provMechanismStr=" + provMechanismStr);
try {
RoleManager roleManager = Platform.getService(RoleManager.class);
Set<String> retAttrs = new HashSet<String>();
retAttrs.add(RoleAttributeName.NAME.getId());
SearchCriteria criteria = new SearchCriteria(RoleAttributeName.KEY.getId(), roleKeyStr, SearchCriteria.Operator.EQUAL);
List<Role> roles = roleManager.search(criteria, retAttrs, null);
String roleName = "";
roleName = roles.get(0).getName();
System.out.println("Role Name: " + roles.get(0).getName());
StringTokenizer st = new StringTokenizer(roleName, " ");
StringBuffer adminRoleName = new StringBuffer();
while(st.hasMoreTokens()) {
String str = st.nextToken();
adminRoleName.append(str);
}
adminRoleName.append("Admin");
System.out.println("Admin Role Name: " + adminRoleName.toString());
AdminRoleService adminRoleService = Platform.getService(AdminRoleService.class);
AdminRole adminRole = null;
boolean found = true;
try {
adminRole = adminRoleService.getAdminRole(adminRoleName.toString());
} catch (Exception ex) {
ex.printStackTrace();
found = false;
}
if(!found) {
return new EventResult();
}
for(int i = 0; i < userKeys.size(); i++) {
String userKeyStr = (String)userKeys.get(i);
if(orchestration.getOperation().equalsIgnoreCase("CREATE")) {
System.out.println("Assigning adminRole " + adminRoleName.toString() + " to user " + userKeyStr);
System.out.println("Scope: " + adminRole.getMemRuleScopes().get(0).getScopeId());
AdminRoleMembership membership = new AdminRoleMembership();
membership.setAdminRole(adminRole);
membership.setUserId(userKeyStr);
// membership.setScopeId("3"); // top
membership.setScopeId(adminRole.getMemRuleScopes().get(0).getScopeId() + ""); // top
adminRoleService.addAdminRoleMembership(membership);
System.out.println("adminRole " + adminRoleName.toString() + " assigned ");
// membership.setScopeId(orgKey);
// membership.setHierarchicalScope(true);
} else
if(orchestration.getOperation().equalsIgnoreCase("DELETE")) {
System.out.println("Revoking adminRole " + adminRoleName.toString() + " from user " + userKeyStr);
List<String> lroles = new ArrayList();
lroles.add(adminRoleName.toString());
List<AdminRoleMembership> list = adminRoleService.listMembershipsForUserByRoleName(userKeyStr, lroles);
if(list.size() > 0) {
adminRoleService.removeAdminRoleMembership(list.get(0));
}
System.out.println("adminRole " + adminRoleName.toString() + " revoked ");
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return new EventResult();
}
Q: Мне необходимо запрашивать и согласовывать доступ пользователей внутри OIM (назначение администраторов и т.д.), однако OIM не поддерживает запрос административных ролей, как лучше поступить?
Ответ - под катом.
Действительно, напрямую запрос административных ролей в OIM не поддерживается, однако это легко исправить при реализации плагина, автоматически назначающего административную роль при назначении роли.
Работу с административными ролями, включая создание административной роли, запрос и согласование, я постарался описать в документе:
Работа с административными ролями в OIM 11gR2PS3
Проект JDeveloper с кодом плагина.
Код самого метода плагина:
public EventResult execute(long processId, long eventId, Orchestration orchestration) {
System.out.println("\n\n======================================= project1.UserRoleHandler::EventResult execute=====\n\n");
HashMap<String, Serializable> parameters = orchestration.getParameters();
System.out.println("\n\n======================================= Parameters: " + parameters + "\n");
System.out.println("\n\n======================================= Operation: " + orchestration.getOperation() + "\n");
String roleKeyStr = (String)parameters.get("roleKey");
ArrayList userKeys = (ArrayList)parameters.get("userKeys");
String provMechanismStr = (String)parameters.get("usg_prov_mechanism");
System.out.println("roleKeyStr=" + roleKeyStr);
System.out.println("userKeys=" + userKeys);
System.out.println("provMechanismStr=" + provMechanismStr);
try {
RoleManager roleManager = Platform.getService(RoleManager.class);
Set<String> retAttrs = new HashSet<String>();
retAttrs.add(RoleAttributeName.NAME.getId());
SearchCriteria criteria = new SearchCriteria(RoleAttributeName.KEY.getId(), roleKeyStr, SearchCriteria.Operator.EQUAL);
List<Role> roles = roleManager.search(criteria, retAttrs, null);
String roleName = "";
roleName = roles.get(0).getName();
System.out.println("Role Name: " + roles.get(0).getName());
StringTokenizer st = new StringTokenizer(roleName, " ");
StringBuffer adminRoleName = new StringBuffer();
while(st.hasMoreTokens()) {
String str = st.nextToken();
adminRoleName.append(str);
}
adminRoleName.append("Admin");
System.out.println("Admin Role Name: " + adminRoleName.toString());
AdminRoleService adminRoleService = Platform.getService(AdminRoleService.class);
AdminRole adminRole = null;
boolean found = true;
try {
adminRole = adminRoleService.getAdminRole(adminRoleName.toString());
} catch (Exception ex) {
ex.printStackTrace();
found = false;
}
if(!found) {
return new EventResult();
}
for(int i = 0; i < userKeys.size(); i++) {
String userKeyStr = (String)userKeys.get(i);
if(orchestration.getOperation().equalsIgnoreCase("CREATE")) {
System.out.println("Assigning adminRole " + adminRoleName.toString() + " to user " + userKeyStr);
System.out.println("Scope: " + adminRole.getMemRuleScopes().get(0).getScopeId());
AdminRoleMembership membership = new AdminRoleMembership();
membership.setAdminRole(adminRole);
membership.setUserId(userKeyStr);
// membership.setScopeId("3"); // top
membership.setScopeId(adminRole.getMemRuleScopes().get(0).getScopeId() + ""); // top
adminRoleService.addAdminRoleMembership(membership);
System.out.println("adminRole " + adminRoleName.toString() + " assigned ");
// membership.setScopeId(orgKey);
// membership.setHierarchicalScope(true);
} else
if(orchestration.getOperation().equalsIgnoreCase("DELETE")) {
System.out.println("Revoking adminRole " + adminRoleName.toString() + " from user " + userKeyStr);
List<String> lroles = new ArrayList();
lroles.add(adminRoleName.toString());
List<AdminRoleMembership> list = adminRoleService.listMembershipsForUserByRoleName(userKeyStr, lroles);
if(list.size() > 0) {
adminRoleService.removeAdminRoleMembership(list.get(0));
}
System.out.println("adminRole " + adminRoleName.toString() + " revoked ");
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return new EventResult();
}
No comments:
Post a Comment