2016-08-02 3 views
1

まずGroupを作成してからUserを作成し、次にgetServiceResourceResolver(map)またはloginService( "datawrite"、null)を使用してグループにユーザーを追加します。AccessDeniedException私はグループとユーザーをaem 6.2(6.1)でプログラム的に作成していますか?

私は、次のコードを試してみました私は(adminSession.save())セッションの保存時に例外を取得しています:

public void addGroupUser(SlingHttpServletRequest request) { 
     log.info("----------------------------------------> addGroupUser"); 
     String groupName = request.getParameter("groupName"); 
     String userName = request.getParameter("userName"); 
     String password = request.getParameter("password"); 

     Session adminSession = null; 
     ResourceResolver adminResolver = null; 
     try { 
      Map<String, Object> authInfoParam = new HashMap<String, Object>(); 
      authInfoParam.put(ResourceResolverFactory.SUBSERVICE, "datawrite"); 
      adminResolver = resolverFactory.getServiceResourceResolver(authInfoParam); 
      //adminResolver = resolverFactory.getAdministrativeResourceResolver(null); //deprecated method 
      adminSession = slingRepository.loginService("datawrite", null); 
      log.info("----------------------------------------> Session user id = {}",adminSession.getUserID()); 

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

      // Create a Group 
      Group group= null; 
      if (userManager.getAuthorizable(groupName) == null) { 
       //adminResolver.refresh(); 
       group = userManager.createGroup(groupName,new SimplePrincipal(groupName),"/home/groups/test"); 

       ValueFactory valueFactory = adminSession.getValueFactory(); 
       Value groupNameValue = valueFactory.createValue(groupName, PropertyType.STRING); 
       group.setProperty("./profile/givenName", groupNameValue); 
       //adminResolver.commit(); 
       log.info("----------------------------------------> {} Group successfully created.",group.getID()); 
      } else { 
       log.info("----------------------------------------> Group already exist.."); 
      } 

      // Create a User 
      User user = null; 
      if (userManager.getAuthorizable(userName) == null) { 
       //adminResolver.refresh(); 
       user=userManager.createUser(userName, password,new SimplePrincipal(userName),"/home/users/test"); 

       ValueFactory valueFactory = adminSession.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); 
       //adminResolver.commit(); 
       log.info("----------------------------------------> {} User successfully created.",user.getID()); 
      } else { 
       log.info("----------------------------------------> User already exist.."); 
      } 

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

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

例外ログは次のとおりです。

javax.jcr.AccessDeniedException: OakAccess0000: Access denied 
    at org.apache.jackrabbit.oak.api.CommitFailedException.asRepositoryException(CommitFailedException.java:231) 
    at org.apache.jackrabbit.oak.api.CommitFailedException.asRepositoryException(CommitFailedException.java:212) 
    at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.newRepositoryException(SessionDelegate.java:670) 
    at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.save(SessionDelegate.java:496) 
    at org.apache.jackrabbit.oak.jcr.session.SessionImpl$8.performVoid(SessionImpl.java:419) 
    at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.performVoid(SessionDelegate.java:274) 
    at org.apache.jackrabbit.oak.jcr.session.SessionImpl.save(SessionImpl.java:416) 
    ... 
Caused by: org.apache.jackrabbit.oak.api.CommitFailedException: OakAccess0000: Access denied 
    at org.apache.jackrabbit.oak.security.authorization.permission.PermissionValidator.checkPermissions(PermissionValidator.java:212) 
    at org.apache.jackrabbit.oak.security.authorization.permission.PermissionValidator.childNodeAdded(PermissionValidator.java:150) 
    at org.apache.jackrabbit.oak.spi.commit.VisibleValidator.childNodeAdded(VisibleValidator.java:104) 
    at org.apache.jackrabbit.oak.spi.commit.VisibleValidator.childNodeAdded(VisibleValidator.java:104) 
    at org.apache.jackrabbit.oak.spi.commit.VisibleValidator.childNodeAdded(VisibleValidator.java:104) 
    at org.apache.jackrabbit.oak.spi.commit.VisibleValidator.childNodeAdded(VisibleValidator.java:32) 
    at org.apache.jackrabbit.oak.spi.commit.CompositeEditor.childNodeAdded(CompositeEditor.java:108) 
    ... 

私は「データ書き込みを持っていますOSGI構成管理インターフェースで構成可能な「Apache Sling Serviceユーザー・マッパー・サービス」のシステム・ユーザーとのサービス・マッピング。

提案と回答をご提供ください。

おかげで、

Arpitボラ

答えて

0

コードが機能するようになりました - そのアクセス許可の問題。私は、管理者グループに「データ書き込み」システムユーザを追加しました:

enter image description here

この道を - OAK例外が発生しないと、システムのユーザーがAEM 6.2/6.1でグループとユーザーを作成することができます。

+0

サービスユーザーにすべての管理者アクセス権を与えるのは良い習慣ではありません。これは、システムユーザを持ち、管理リソースリゾルバを非難するという目的に勝るものです。あなたのサービス/システムユーザは、意図した機能をサポートする権利しか持たないようにしてください。 –

+0

ありがとうございました@Ameeshあなたの提案はaem6.2/6.1のグループとユーザを 'getServiceResourceResolver(map)'メソッドを使って作成する方法です。 – ArpitBora

+0

既にAEMに存在するものを再利用する場合は、AEM 6に付属のコミュニティパッケージを参照することができます。 ユーザーグループを作成して適切なアクセス権を持つユーザーが 'communities-user-admin'プロセス。使用方法の詳細については、java docs - https://docs.adobe.com/docs/en/aem/6-2/develop/ref/javadoc/com/adobe/cq/social/members/endpointsを参照してください。 /package-frame.html パッケージ名は - 'cq-social-members-api'で、'/libs/social/members/install/'にあります。 –

関連する問題