Jan 27, 2016

FAQ: запрос и согласование назначения административной роли в OIM 11gR2PS3

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();
    }

No comments:

Post a Comment