在版本控制节点上向 Jackrabbit 用户强制执行读写 ACL 时出现问题
我们正在使用 Jackrabbit 2.2.7 开发 xml 文档的存储库。
我们希望为存储库创建一组用户,并对他们强制执行某种只读和读写访问权限。我们使用了基于资源的 ACL,如此处所述。只读权限就像魅力一样。然而,当用户尝试创建/删除可版本化的节点 (mix:versionable
) 时,我们很难让读写工作正常进行,即使我们授予他尽可能高的权限,<代码>特权.JCR_ALL。到目前为止我们已经意识到,对版本化节点的修改实际上并不简单。在 Jackrabbit 中,它跨越多个节点 - /jcr:system/jcr:versionStorage 就是其中之一。看来除非用户本身是admin用户,否则无法对/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();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
/jcr:system/jcr:versionStorage
里面的内容不能直接修改。您需要使用 VersionManager< /a> 用于在版本存储中创建、删除或标记版本的接口。任何对版本控制节点具有写访问权限的用户都应该能够执行此操作,因为没有适用于版本存储的额外访问控制。至于版本控制节点本身,请注意它们是只读。您需要显式签出版本控制节点以使其可写。
The content inside
/jcr:system/jcr:versionStorage
can not be directly modified. You need to use the VersionManager interface to create, remove or label versions inside the version storage. Any user with write access to the versionable node should be able to do that, as there are no extra access controls that apply to the version storage.As for the versionable nodes themselves, note that they are read-only when checked in. You need to explicitly check out a versionable node to make it writable.