向 ACL 添加限制会在 Jackrabbit Oak 中的查询产生空结果

Posted

技术标签:

【中文标题】向 ACL 添加限制会在 Jackrabbit Oak 中的查询产生空结果【英文标题】:Adding restrictions to ACLs yields empty results for queries in Jackrabbit Oak 【发布时间】:2019-06-14 07:09:42 【问题描述】:

使用 Jackrabbit Oak,我一直在尝试通过 SecurityProviderSecurityConfigurations 配置安全性。特别是,我一直在使用通常按预期工作的限制。但是,在处理 JCR-SQL2 查询时,过滤掉的内容比预期的要多。

详情

可以使用下面的存储库进行复制。

/
  node          [nt:unstructured]
    subnode     [nt:unstructured]

node 上,我为user 添加一个权限为JCR_ALL 的访问控制条目,同时为rep:glob 添加一个限制 -> "",这样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

如果要从上面的代码中删除restrictionsnodesubnode 都会按预期出现在查询结果中。

MySecurityProvider 使用ConfigurationParameters.EMPTY 和所有SecurityConfigurations 的默认实现,除了我自己实现的AuthenticationConfiguration

class MyAuthenticationConfiguration extends AuthenticationConfigurationImpl 
    public MyAuthenticationConfiguration(SecurityProvider securityProvider) 
        super(securityProvider);
    

    @NotNull
    @Override
    public LoginContextProvider getLoginContextProvider(ContentRepository contentRepository) 
        return new LoginContextProvider() 
            @NotNull
            public LoginContext getLoginContext(Credentials credentials, String workspaceName) 
                String userId = ((UserIdCredentials) credentials).getUserId();
                Set<Principal> principalSets = new HashSet<>();
                if (userId.isEmpty()) 
                    principalSets.add(SystemPrincipal.INSTANCE);
                 else 
                    principalSets.add(new PrincipalImpl(userId));
                
                Map<String, ? extends Principal> publicPrivileges = new HashMap<>();
                AuthInfoImpl authInfoImpl = new AuthInfoImpl(userId, publicPrivileges, principalSets);
                Subject subject = new Subject(true, principalSets, Collections.singleton(authInfoImpl), new HashSet<Principal>());
                return new PreAuthContext(subject);
            
        ;
    

我正在使用 Jackrabbit Oak 1.10.0 版

【问题讨论】:

【参考方案1】:

这原来是 Jackrabbit Oak 中的一个错误 - Link to issue。

从 1.12.0 版开始解决此问题

【讨论】:

以上是关于向 ACL 添加限制会在 Jackrabbit Oak 中的查询产生空结果的主要内容,如果未能解决你的问题,请参考以下文章

squid的ACL日志分析反向代理

Jackrabbit 和并发修改

acl 限制一个ip访问外网,在局域网内,限制一个ip地址访问外网的acl,希望给出具体的acl命令,思科的最好

是否有直接编辑 Jackrabbit 存储库内容的工具?

Apache Jackrabbit - 重复节点?

从 TFS 项目管理员中删除“编辑团队项目级别权限 ACL”,以便他们无法添加用户