我正在尝试为节点创建一个acl:
ZooKeeper client = new ZooKeeper("host:port/rootNode", 3000, null);
ACL acl = new ACL(Perms.CREATE,new Id("digest","user:pass"));
client.create("/testNode",new String("test").getBytes(), Arrays.asList(acl), CreateMode.PERSISTENT);
client.close();
然后我尝试访问该节点并在“testNode”下创建一个节点:
ZooKeeper client = new ZooKeeper(" host:port/rootNode", 3000, null);
client.addAuthInfo("digest", new String("user:pass").getBytes());
Stat stat;
try {
stat = client.exists("/testNode", false);
if(stat!=null){
client.create("/testNode/clientTest", new String("clienttest").getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}
} catch (KeeperException e) {
e.printStackTrace();
}
client.close();
但它给了我:
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /testNode/clientTest
当我错了?
谢谢!
答案 0 :(得分:0)
该文件说:
digest使用username:password字符串生成MD5哈希值 然后用作ACL ID身份。通过发送来完成身份验证 用户名:明文密码。在ACL中使用表达式时 将是用户名:base64编码的SHA1密码摘要。
因此,在创建节点时,ACL表达式不能只是user:pass
,必须对其进行编码。
这样做:
String s = Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA1").digest("user:pass".getBytes()));
ACL acl = new ACL(ZooDefs.Perms.ALL, new Id("digest","user:" + s));
不过,这个文件有点不对劲。因为根据这个,你应该digest("pass")
。但是这不起作用,你必须散列整个字符串digest("user:pass")