我使用Jackrabbit Oak,试图通过SecurityProvider
和SecurityConfiguration
来配置安全性。特别是,我一直在使用通常可以按预期使用的限制。但是,在处理JCR-SQL2
个查询时,过滤掉的数据比预期的要多。
详细信息
它可以在下面的存储库中复制。
/
node [nt:unstructured]
subnode [nt:unstructured]
在node
上,我为JCR_ALL
添加了具有权限user
的访问控制条目,并为rep:glob
-> ""
设置了限制,使得{ {1}}无权访问user
的任何子级。
使用node
时可以正常工作:
session.getNode
返回节点session.getNode("/node")
会按预期抛出session.getNode("/node/subnode")
。但是,当我执行以下PathNotFoundException
查询时:
JCR-SQL2
我没有结果。我本来希望得到SELECT * FROM [nt:unstructured]
,因为使用/node
时可以使用它。
代码
session.getNode
如果要从上面的代码中删除public static void main(String[] args) throws Exception {
Repository repository = new Jcr().with(new MySecurityProvider()).createRepository();
Session session = repository.login(new UserIdCredentials("")); // principal is "SystemPrincipal.INSTANCE"
// Create nodes
Node node = session.getRootNode().addNode("node", "nt:unstructured");
node.addNode("subnode", "nt:unstructured");
// Add access control entry + restriction
AccessControlManager acm = session.getAccessControlManager();
JackrabbitAccessControlList acl = (JackrabbitAccessControlList) acm
.getApplicablePolicies("/node").nextAccessControlPolicy();
Privilege[] privileges = new Privilege[]{acm.privilegeFromName(Privilege.JCR_ALL)};
Map<String, Value> restrictions = new HashMap<String, Value>() {{put("rep:glob", new StringValue(""));}};
acl.addEntry(new PrincipalImpl("user"), privileges, true, restrictions);
acm.setPolicy("/node", acl);
session.save();
// executes query
RowIterator rows = repository.login(new UserIdCredentials("user")).getWorkspace().getQueryManager()
.createQuery("SELECT * FROM [nt:unstructured]", Query.JCR_SQL2).execute().getRows();
System.out.println("Number of rows: " + rows.getSize()); //Prints 0
}
,则restrictions
和node
都会出现在查询结果中。
subnode
使用MySecurityProvider
和所有ConfigurationParameters.EMPTY
的默认实现,但我自己实现的SecurityConfiguration
除外:
AuthenticationConfiguration
我正在使用Jackrabbit Oak版本1.10.0