2

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

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

所以我的问题是

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

这是来自的安全部分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();
 }
4

1 回答 1

1

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

至于可版本化节点本身,请注意它们在签入时是只读的。您需要显式签出可版本化节点以使其可写。

于 2011-12-03T09:45:55.150 回答