我们正在使用 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();
}