无法在可版本化节点上对Jackrabbit用户强制执行读写ACL

时间:2011-11-17 20:59:53

标签: jackrabbit jcr

我们正在使用Jackrabbit 2.2.7开发xml文档的存储库。

我们希望为存储库创建一堆用户,并对它们强制执行某种只读和读写访问权限。我们使用了基于资源的ACL,如here所述。只读权限可以作为魅力。但是,当用户尝试创建/删除可版本化的节点(mix:versionable)时,我们很难获得读写功能,即使我们授予他最高权限Privilege.JCR_ALL。到目前为止,我们已经意识到对版本化节点的修改实际上并不简单。在Jackrabbit中,它跨越多个节点 - /jcr:system/jcr:versionStorage就是其中之一。似乎除非用户本身是管理员用户,否则他无法修改/jcr:system/及其子节点。

所以我的问题是

  • a)有没有办法让普通用户修改可版本化的节点?
  • b)有没有办法在jackrabbit(指针,维基,代码片段)中创建多个管理员用户?

以下是repository.xml

的安全部分
<Security appName="Jackrabbit">
    <SecurityManager class="org.apache.jackrabbit.core.DefaultSecurityManager" 
        workspaceName="security">
        <!-- <WorkspaceAccessManager class="..."/> -->
        <!-- <param name="config" value="${rep.home}/security.xml"/> -->
    </SecurityManager>

    <AccessManager 
        class="org.apache.jackrabbit.core.security.DefaultAccessManager">
        <!-- <param name="config" value="${rep.home}/access.xml"/> -->
    </AccessManager>

    <LoginModule 
        class="org.apache.jackrabbit.core.security.authentication.DefaultLoginModule">
       <!--
          anonymous user name ('anonymous' is the default value)
        -->
       <param name="anonymousId" value="anonymous"/>
       <!--
          administrator user id (default value if param is missing is 'admin')
        -->
       <param name="adminId" value="admin"/>
    </LoginModule>
</Security>

以下是我们创建用户和启用访问控制的方法:

    {
        ...
        JackrabbitSession js = (JackrabbitSession) session;
        UserManager um = js.getUserManager();
        Authorizable grp = um.getAuthorizable("usergroup");
        Group userGroup = null;
        if(grp == null){
            userGroup = um.createGroup("usergroup");
        }else{
            userGroup = (Group) grp;
        }

        User user = um.createUser(newUserName, newUserPass);
        userGroup.addMember(user);

        Node node = session.getNode("/root");           

        AccessControlManager acm = session.getAccessControlManager();
        AccessControlList acl = getList(acm, node.getPath());

        Privilege[] privileges = null ;
        if(privilege.equals("r")){

            privileges = new Privilege[]
            {
                acm.privilegeFromName(Privilege.JCR_READ),
                acm.privilegeFromName(Privilege.JCR_LOCK_MANAGEMENT)
            };

        }else if(privilege.equals("rw")){
            privileges = new Privilege[]
            {

                acm.privilegeFromName(Privilege.JCR_ALL)
            };
        }else{

            return;
        }
        acl.addAccessControlEntry(new PrincipalImpl(user.getID()), privileges);
        acm.setPolicy(node.getPath(), acl);

        session.save();
 }

1 个答案:

答案 0 :(得分:1)

/jcr:system/jcr:versionStorage内的内容无法直接修改。您需要使用VersionManager界面在版本存储中创建,删除或标记版本。任何对可版本化节点具有写访问权限的用户都应该能够这样做,因为没有适用于版本存储的额外访问控制。

对于可版本化节点本身,请在签入时注意它们是 read-only 。您需要显式check out一个可版本化节点才能使其可写。