2016-07-29 27 views
1

Ist es möglich, Gruppe und Benutzer in AEM6.2 mithilfe von Jackrabbit User Manager API mit Berechtigungen zu erstellen. Ich habe gerade unter URL gefolgt aber der Code eine Ausnahme wirft:Wie erstellt man Benutzer und Gruppen in aem6.2 programmatisch mit ACL-Berechtigungen?

  1. https://helpx.adobe.com/experience-manager/using/jackrabbit-users.html

  2. https://stackoverflow.com/questions/38259047/how-to-give-permission-all-in-aem-through-programatically

  3. ResourceResolverFactory getServiceResourceResolver throws Exception in AEM 6.1

Als getAdministrativeResourceResolver(Map) Methode dann veraltet ist, kann, wie Wir verwenden getServiceResourceResolver(Map) erfüllt Hod stattdessen.

Bitte geben Sie Ihren Vorschlag.

Antwort

2

Teilen meiner Lösung, die für andere hilfreich sein wird.

Es folgt der Code unter Verwendung getServiceResourceResolver(Map) Verfahren zum Erzeugen Gruppe zuerst und dann User und dann Benutzer in der Gruppe mit ACL-Privilegien und die Erlaubnis hinzuzufügen:

public void createGroupUser(SlingHttpServletRequest request) { 
    String userName = request.getParameter("userName"); 
    String password = request.getParameter("password"); 
    String groupName = request.getParameter("groupName"); 

    Session session = null; 
    ResourceResolver resourceResolver = null; 
    try { 
     Map<String, Object> param = new HashMap<String, Object>(); 
     param.put(ResourceResolverFactory.SUBSERVICE, "datawrite"); 
     resourceResolver = resourceResolverFactory.getServiceResourceResolver(param); 
     session = resourceResolver.adaptTo(Session.class); 

     // Create UserManager Object 
     final UserManager userManager = AccessControlUtil.getUserManager(session); 

     // Create a Group 
     Group group = null; 
     if (userManager.getAuthorizable(groupName) == null) { 
      group = userManager.createGroup(groupName); 

      ValueFactory valueFactory = session.getValueFactory(); 
      Value groupNameValue = valueFactory.createValue(groupName, PropertyType.STRING); 
      group.setProperty("./profile/givenName", groupNameValue); 
      session.save(); 

      log.info("---> {} Group successfully created.", group.getID()); 
     } else { 
      log.info("---> Group already exist.."); 
     } 

     // Create a User 
     User user = null; 
     if (userManager.getAuthorizable(userName) == null) { 
      user = userManager.createUser(userName, password); 

      ValueFactory valueFactory = session.getValueFactory(); 
      Value firstNameValue = valueFactory.createValue("Arpit", PropertyType.STRING); 
      user.setProperty("./profile/givenName", firstNameValue); 

      Value lastNameValue = valueFactory.createValue("Bora", PropertyType.STRING); 
      user.setProperty("./profile/familyName", lastNameValue); 

      Value emailValue = valueFactory.createValue("[email protected]", PropertyType.STRING); 
      user.setProperty("./profile/email", emailValue); 
      session.save(); 

      // Add User to Group 
      Group addUserToGroup = (Group) (userManager.getAuthorizable(groupName)); 
      addUserToGroup.addMember(userManager.getAuthorizable(userName)); 
      session.save(); 

      // set Resource-based ACLs 
      String nodePath = user.getPath(); 
      setAclPrivileges(nodePath, session); 

      log.info("---> {} User successfully created and added into group.", user.getID()); 
     } else { 
      log.info("---> User already exist.."); 
     } 

    } catch (Exception e) { 
     log.info("---> Not able to perform User Management.."); 
     log.info("---> Exception.." + e.getMessage()); 
    } finally { 
     if (session != null && session.isLive()) { 
      session.logout(); 
     } 
     if (resourceResolver != null) 
      resourceResolver.close(); 
    } 
} 

public static void setAclPrivileges(String path, Session session) { 
    try { 
     AccessControlManager aMgr = session.getAccessControlManager(); 

     // create a privilege set 
     Privilege[] privileges = new Privilege[] { 
       aMgr.privilegeFromName(Privilege.JCR_VERSION_MANAGEMENT), 
       aMgr.privilegeFromName(Privilege.JCR_MODIFY_PROPERTIES), 
       aMgr.privilegeFromName(Privilege.JCR_ADD_CHILD_NODES), 
       aMgr.privilegeFromName(Privilege.JCR_LOCK_MANAGEMENT), 
       aMgr.privilegeFromName(Privilege.JCR_NODE_TYPE_MANAGEMENT), 
       aMgr.privilegeFromName(Replicator.REPLICATE_PRIVILEGE) }; 

     AccessControlList acl; 
     try { 
      // get first applicable policy (for nodes w/o a policy) 
      acl = (AccessControlList) aMgr.getApplicablePolicies(path).nextAccessControlPolicy(); 
     } catch (NoSuchElementException e) { 
      // else node already has a policy, get that one 
      acl = (AccessControlList) aMgr.getPolicies(path)[0]; 
     } 
     // remove all existing entries 
     for (AccessControlEntry e : acl.getAccessControlEntries()) { 
      acl.removeAccessControlEntry(e); 
     } 
     // add a new one for the special "everyone" principal 
     acl.addAccessControlEntry(EveryonePrincipal.getInstance(), privileges); 

     // the policy must be re-set 
     aMgr.setPolicy(path, acl); 

     // and the session must be saved for the changes to be applied 
     session.save(); 
    } catch (Exception e) { 
     log.info("---> Not able to perform ACL Privileges.."); 
     log.info("---> Exception.." + e.getMessage()); 
    } 
} 

In Code „Datawrite“ ist ein Service-Mapping, das ist mit dem Systembenutzer in "Apache Sling Service User Mapper Service" zugeordnet, die in der OSGI-Konfiguration Admin-Schnittstelle konfiguriert werden kann.

Für weitere Einzelheiten über Systembenutzer Check Link - How to Create System User in AEM?

+0

Wo hast du diesen Code, damit er beim Start der AEM-Instanz ausgeführt wird? – Jdruwe

0

Ich stelle diesen Code direkt von einem Training eines offiziellen Adobe-Kanals zur Verfügung, und es basiert auf AEM 6.1. Ich nehme an, dies könnte die beste Vorgehensweise sein.

private void modifyPermissions() { 
    Session adminSession = null; 
    try{ 
     adminSession = repository.loginService(null, repository.getDefaultWorkspace()); 

     UserManager userMgr= ((org.apache.jackrabbit.api.JackrabbitSession)adminSession).getUserManager(); 
     AccessControlManager accessControlManager = adminSession.getAccessControlManager(); 

     Authorizable denyAccess = userMgr.getAuthorizable("deny-access"); 

     AccessControlPolicyIterator policyIterator = 
       accessControlManager.getApplicablePolicies(CONTENT_GEOMETRIXX_FR); 
     AccessControlList acl; 
     try{ 
      acl=(JackrabbitAccessControlList) policyIterator.nextAccessControlPolicy();    
     }catch(NoSuchElementException nse){ 
      acl=(JackrabbitAccessControlList) accessControlManager.getPolicies(CONTENT_GEOMETRIXX_FR)[0]; 

     } 

     Privilege[] privileges = {accessControlManager.privilegeFromName(Privilege.JCR_READ)}; 
     acl.addAccessControlEntry(denyAccess.getPrincipal(), privileges); 
     accessControlManager.setPolicy(CONTENT_GEOMETRIXX_FR, acl); 
     adminSession.save(); 
    }catch (RepositoryException e){ 
     LOGGER.error("**************************Repo Exception", e); 
    }finally{ 
     if (adminSession != null) 
      adminSession.logout(); 
    } 
+0

Vielen Dank für Ihre sugession Vinicius Maciel, aber ich will Gruppe erstellen und dann User und dann möchte ich Benutzer zu Gruppe hinzufügen mit getServiceResourceResolver (Karte) oder loginService ("datawrite", null) -Methode mit ACL-Berechtigungen. Gibt es eine Möglichkeit, eine Gruppe mit getServiceResourceResolver (map) oder loginService ("datawrite", null) zu erstellen? – ArpitBora