2012-10-25 4 views
0

jackrabbit 저장소에서 그룹에 권한을 추가하려고합니다. 나는 "디자이너"그룹이/템플릿 노드에 쓸 수있는 것을 원합니다. 폴더Jackrabbit 그룹 ACL 관리. 그룹 권한이있는 노드에서 노드 추가를 거부했습니다.

첫째, 내가라는 이름의 그룹을 만듭니다 "디자이너"

userManager = jkSession.getUserManager(); 

     Roles[] rolesTable = { Roles.EDITOR, Roles.DESIGNER, 
       Roles.OPERATOR, Roles.ADMINISTRATOR }; 

     for (Roles role : rolesTable) { 


       userManager.createGroup(role.toString()); 

      ... 

및이 그룹/템플릿 노드에 권한을 할당 :

이 노드 (/ 템플릿) 형 NT와 노드입니다 :

p = principalManager.findPrincipals(
           Roles.DESIGNER.toString(), 
           PrincipalManager.SEARCH_TYPE_GROUP) 
           .nextPrincipal(); 
    Node catalogNode = session.getRootNode().getNode("templates"); 

       AccessControlPolicyIterator accessControlPolicyIterator = accessControlManager 
         .getApplicablePolicies(catalogNode.getPath()); 

    AccessControlPolicy policy = accessControlPolicyIterator 
           .nextAccessControlPolicy(); 

         if (polic 

y instanceof AccessControlList) { 

         AccessControlList acl = (AccessControlList) policy; 

         JackrabbitAccessControlList jackAcl = (JackrabbitAccessControlList) acl; 
         jackAcl 
           .addEntry(
             p, 
             new Privilege[] { 
               accessControlManager 
                 .privilegeFromName(Privilege.JCR_ADD_CHILD_NODES), 
               accessControlManager 
                 .privilegeFromName(Privilege.JCR_READ), 
               accessControlManager 
                 .privilegeFromName(Privilege.JCR_WRITE), 
               accessControlManager 
                 .privilegeFromName(Privilege.JCR_REMOVE_NODE) }, 
             true, null); 

이제 사용자를 생성 및 디자이너 그룹에 그에게 회원 수 :

Principal principal = principalManager.findPrincipals(DESIGNER.toString(), 
      PrincipalManager.SEARCH_TYPE_GROUP).nextPrincipal(); 
Group roleToAssign = (Group) userManager.getAuthorizable(principal); 

     user = userManager.createUser(login, password); 

     roleToAssign.addMember(user); 

지금 해당 사용자로 로그인하고 addNode 명을 시도/템플릿

lCredentials = new SimpleCredentials(login, new String(pPassword) 
        .toCharArray()); 
     } 

     Repository tmpRepository = null; 

     try { 
      tmpRepository = repositoryFactory.getRepository(repositoryParams); 
      session = tmpRepository.login(lCredentials, pWorkspace); 

및/템플릿에 노드를 추가 :..

session.getRootNode()는 getNode ("템플릿") addNode 명을 ("테스트 ","nt : unstructured "); 그러나

는 accessDenied을 던져 :

javax.jcr.AccessDeniedException: Access denied. 
    at org.apache.jackrabbit.core.security.DefaultAccessManager.checkPermission(DefaultAccessManager.java:193) 
    at org.apache.jackrabbit.core.NodeImpl.addNode(NodeImpl.java:1266) 
    at org.apache.jackrabbit.core.session.AddNodeOperation.perform(AddNodeOperation.java:111) 
    at org.apache.jackrabbit.core.session.AddNodeOperation.perform(AddNodeOperation.java:37) 
    at org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:216) 
    at org.apache.jackrabbit.core.ItemImpl.perform(ItemImpl.java:91) 
    at org.apache.jackrabbit.core.NodeImpl.addNodeWithUuid(NodeImpl.java:1814) 
    at org.apache.jackrabbit.core.NodeImpl.addNode(NodeImpl.java:1774) 
    at org.apache.jackrabbit.commons.JcrUtils.getOrAddNode(JcrUtils.java:519) 

내가 jackrabbits 그룹에 대한 ACL에 대한 문서를 찾을 수 없습니다. 누군가 나를 도울 수 있습니까? 감사.

답변

1

수정 됨.

주체 (그룹 또는 사용자)에 대한 권한의 경우이 게시물에서와 같이 리소스 ACL이 아닌 Principal 기반 ACL을 사용해야합니다.

Jackrabbit ACL

그러나 는 또한 자식 노드를 추가하는 권한 목록에서 권한 에게 JCR_NODE_TYPE_MANAGEMENT를 추가 할 필요가있다 (예,이 게시물은 RTFM 케이스이었다) :

교장-자료 ACL이 설명되어 있습니다 특정 유형의

privileges = new Privilege[] { 
            accessControlManager 
              .privilegeFromName(Privilege.JCR_ADD_CHILD_NODES), 
            accessControlManager 
              .privilegeFromName(Privilege.JCR_READ), 
            accessControlManager 
              .privilegeFromName(Privilege.JCR_WRITE), 
            accessControlManager 
              .privilegeFromName(Privilege.JCR_NODE_TYPE_MANAGEMENT) }; 

감사합니다.

+1

여기서 중요한 점은 JCR_NODE_TYPE_MANAGEMENT를 추가하는 것입니다. 주체 기반 ACL을 사용할 필요는 없지만 리소스 ACL은 정상적으로 작동합니다. BTW JCR_WRITE에 이미 JCR_ADD_CHILD_NODES가 포함되어 있으므로 명시 적으로 추가 할 필요가 없습니다. – Dale

+1

"자식 추가"권한이 작동하려면 네 가지 권한이 모두 필요하다는 것을 확인할 수 있습니다. JCR_ADD_CHILD_NODES + JCR_READ + JCR_WRITE + JCR_NODE_TYPE_MANAGEMENT가 있어야합니다. 제 경우에는 자식 노드가 실제 노드 자체를 쓰기 가능하게하지 않고 * 추가 ​​할 수 있도록하고 싶었습니다. 나는 JCR 디자이너가 예상하지 못한 경우라고 생각합니다. "소셜 미디어"세계에서는 콘텐츠 사용자가 "읽을 수"있고 해당 사용자가 댓글을 달 수는 있지만 편집 할 수 없도록하려는 공통 패턴이 있기 때문에 이는 불행한 일입니다. 내가 틀렸다면 나를 교정하십시오. –