0
votes

I have many 'nt:folder' Nodes created and upon each folder creation, permissions has been granted to different set of users. Now I need to get list of nodes based on user(with read and write) persmissions.

Using jackrabbit 2.6.0

Partial snippet of user creation and privieges assignement:

  • User creation
    UserManager userManager = ((JackrabbitSession) session).getUserManager(); 
    org.apache.jackrabbit.api.security.user.User user =
    (org.apache.jackrabbit.api.security.user.User)userManager.getAuthorizable(userName);
  • Add entry
    javax.jcr.security.Privilege[] privileges = new
      javax.jcr.security.Privilege[] {
        accessControlManager.privilegeFromName(javax.jcr.security.Privilege.JCR_WRITE)
      };
  • Temporary folder access
    Map<String, Value> restrictions = new HashMap<String, Value>(); 
    restrictions.put("rep:nodePath",
      valueFactory.createValue(userDbInstance.getUserFilePath(),
      PropertyType.PATH));  restrictions.put("rep:glob",
      valueFactory.createValue("*"));
    accessControlList.addEntry(userPrincipal, privileges, true  /*allow or deny */, restrictions);
  • Adding Node

    public Node addNode(String parent, String name, ETNodeTypes type) throws JCRServiceException { 
      checkSession(); 
      try { 
        name = Text.escapeIllegalJcrChars(name); 
        logger.debug("Adding Node: " + parent + "  type: " + type + "  name(escaped):" + name); 
        Node node = session.getNode(parent).addNode(name, type.getName()); 
        node.addMixin("rep:AccessControllable"); 
        logger.debug("Node added: " + node.getPath()); 
        return node; 
      } catch (RepositoryException e) { 
          e.printStackTrace(); 
          throw new JCRServiceException(e,e.getMessage(),"Unable to create"); 
      } 
    } 
    

Thanks.

1

1 Answers

2
votes

I recently posted on answering a similar question: Using JCR-SQL2 for querying ACLs in a Jackrabbit repository.

This was my example query:

select resource.*, ace.*
from [nt:hierarchyNode] as resource
inner join [rep:ACL] as acl
   ON ISCHILDNODE(acl, resource)
inner join [rep:ACE] as ace
   ON ISCHILDNODE(ace, acl)
where ace.[rep:principalName] = 'username'