我们正在使用Jackrabbit 2.2.7开发xml文档的存储库。
我们希望为存储库创建一堆用户,并对它们强制执行某种只读和读写访问权限。我们使用了基于资源的ACL,如here所述。只读权限可以作为魅力。但是,当用户尝试创建/删除可版本化的节点(mix:versionable
)时,我们很难获得读写功能,即使我们授予他最高权限Privilege.JCR_ALL
。到目前为止,我们已经意识到对版本化节点的修改实际上并不简单。在Jackrabbit中,它跨越多个节点 - /jcr:system/jcr:versionStorage
就是其中之一。似乎除非用户本身是管理员用户,否则他无法修改/jcr:system/
及其子节点。
所以我的问题是
以下是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();
}
答案 0 :(得分:1)
/jcr:system/jcr:versionStorage
内的内容无法直接修改。您需要使用VersionManager界面在版本存储中创建,删除或标记版本。任何对可版本化节点具有写访问权限的用户都应该能够这样做,因为没有适用于版本存储的额外访问控制。
对于可版本化节点本身,请在签入时注意它们是 read-only 。您需要显式check out一个可版本化节点才能使其可写。