Curator Framework 绕过 Zookeeper ACL 设置

Curator Framework bypasses Zookeeper ACL settings

我需要为访问 zookeeper 服务器内部数据的客户端设置 user:password 身份验证。我正在尝试使用 zkCli 和 Curator Framework 来弄清楚它是如何工作的,并且出于某种原因,从 Curator Framework 执行的代码绕过了所有安全设置,并且在它不应该拥有完全访问权限时表现得像它具有完全访问权限。

我一直在关注这些问题的答案:

zkCli:

[zk: localhost:7999(CONNECTED) 29] create /testpath contents digest:user:smGaoVKd/cQkjm7b88GyorAUz20=:cdrwa
Created /testpath
[zk: localhost:7999(CONNECTED) 4] getAcl /testpath
'digest,'user:smGaoVKd/cQkjm7b88GyorAUz20=
: cdrwa
[zk: localhost:7999(CONNECTED) 30] rmr /testpath  
Authentication is not valid : /testpath
[zk: localhost:7999(CONNECTED) 31]

如上结果符合预期,我们添加了ACL限制,现在无法访问创建的节点。但是,当我尝试使用 Curator Framework 访问此节点时,它会删除它,但它不应该。

        String zkConnectString = "hostname:7999";
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString(zkConnectString)
                .retryPolicy(retryPolicy)
                .build();
        client.start();
        try {
            client.delete().forPath("/testpath");
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }

因此 java Curator Framework 代码成功删除了节点,而不是给出任何身份验证错误。我做错了什么?

产品版本:

策展人框架:2.11.1

动物园管理员服务器:3.4.5

动物园管理员java客户端:3.4.12

在 ZooKeeper CLI 中,您正在调用 rmr,即全部删除。您遇到了 ACL 违规,因为 ACL 适用于 /testpath 下的节点,而您没有对 delete/get 下的节点的权限(这很可能是抱怨)/testpath 下的节点。请注意,如果您在 CLI 中改为尝试 delete /testpath 它会起作用(我自己测试过),因为节点 /testpath 采用其父节点的 ACL。老实说,我永远无法将 ZooKeeper ACL 牢记在心,于是我编写了 Curator。因此,简而言之,Curator 正在做正确的事情(与 CLI 所做的事情相同)。