2016-07-29 16 views
1

権限でJackrabbit User Manager APIを使用して、AEM6.2にグループとユーザーを作成することはできますか。 は、私はちょうどURLの下に続いているが、コードはいくつかの例外がスローされます。どのようにすることができ、その後aem6.2でACL権限でユーザとグループを作成するにはどうすればいいですか?

  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

getAdministrativeResourceResolver(Map)の方法としては推奨されませんがgetServiceResourceResolver(Map) metを使用していますホード代わりに。

ご提案をお願いします。

答えて

2

私の解決策を共有することは、他の人にとって役に立ちます。

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

コードで「データ書き込み」があるサービスマッピングです:後

は、コード最初のグループを作成するためのgetServiceResourceResolver(Map)方法を使用して、ユーザーとその後、ACL権限と権限を持つグループにユーザーを追加することです"Apache Sling Service User Mapper Service"でシステムユーザとマッピングされています。これはOSGI設定管理インタフェースで設定できます。システムのユーザチェックリンクについての詳細については

- あなたのsugessionヴィニシウスマシエルためHow to Create System User in AEM?

+0

このコードでは、AEMインスタンスの起動時にどこで実行されるのですか? – Jdruwe

0

私は公式のAdobeチャンネルのトレーニングからこのコードを直接提供しており、AEM 6.1に基づいています。だから私はこれがベストプラクティスであると考えています。

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

おかげで、しかし、私は最初のグループを作成し、ユーザーにしたいと、私はgetServiceResourceResolver(マップ)またはloginServiceを使用してグループにユーザーを追加します( "datawrite"、null)メソッドを使用します。 getServiceResourceResolver(map)またはloginService( "datawrite"、null)メソッドを使用してGroupを作成する方法はありますか? – ArpitBora

関連する問題