我几乎找不到任何关于如何为多个用户设计和构建存储库的文档。
我对 Jackrabbit 很陌生,我一直使用一个主用户凭据来构建一个只有一个主用户可以访问的存储库。
现在我需要一个由数千个用户共享的存储库,每个用户都使用他的节点,并且没有其他用户的权限。
SimpleAccessManager 非常简单:
public boolean isGranted(ItemId id, int permissions) throws RepositoryException {
checkInitialized();
if (system) {
// system has always all permissions
return true;
} else if (anonymous) {
// anonymous is always denied WRITE & REMOVE permissions
if ((permissions & WRITE) == WRITE
|| (permissions & REMOVE) == REMOVE) {
return false;
}
}
return true;
}
看起来无法使用 SimpleLoginModule 和 SimpleAccessManager 创建这样的多用户存储库。因为它只区分 ADMIN 和可以读取所有内容但不能写入的匿名用户......
因此必须使用 DefaultAccessManager 并且可能执行以下操作:
Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
UserManager um = ((JackrabbitSession) session).getUserManager();
User user = um.createUser("john", "doe");
/* And assign some ALC as follows... And then play with it like this, which really sucks without proper documentation, one has to reverse engineer everything, wtf */
AccessControlManager acm = session.getAccessControlManager();
AccessControlPolicyIterator it = acm.getApplicablePolicies(testRootNode.getPath());
while ( it.hasNext() ) {
AccessControlPolicy acp = it.nextAccessControlPolicy();
Privilege[] privileges = new Privilege[]{acm.privilegeFromName(Privilege.JCR_WRITE)};
((AccessControlList)acp).addAccessControlEntry(new PrincipalImpl(user.getUserID()), privileges);
acm.setPolicy(testRootNode.getPath(), acp);
}
可以通过 OpenCMIS 访问该存储库,该 OpenCMIS 提供来自客户端的用户凭据。
编辑:这就是我正在寻找的AccessControl