这里有两个改动,在 1 处使用 addAuthInfo 的方法可以在当前客户端的会话中添加 auth 信息,Digest 的 id 取值为 username:password 直接用明文即可,无论是 username 还是 password 都是自定义的。
然后是查询代码
ZooKeeper client = new ZooKeeper("127.0.0.1:2181", 3000, null); client.addAuthInfo("digest", "laoxun:kaixin".getBytes()); // 这行如果注释的话就会报错 byte[] data = client.getData("/abc", false, null); System.out.println(new String(data)); // test不管创建的时候是何种写法,查询的时候都要使用 addAuthInfo 在会话中添加权限信息,才能对该节点进行查询
3.2.4 Super听名字就知道这个模式是管理员的模式了,因为之前创建的那些节点,如果设置了用户名密码,其他客户端是无法访问的,如果该客户端自己退出了,这些节点就无法去操作了,所以需要管理员这一个角色来对其进行降维打击。
首先 Super 模式是要开启的,我这里假设管理员的用户名为 HelloZooKeeper,密码为 niubi,经过编码后就是 HelloZooKeeper:PT8Sb6Exg9YyPCS7fYraLCsqzR8=, 然后需要在服务端启动的环境中指定 zookeeper.DigestAuthenticationProvider.superDigest 配置,参数就是 HelloZooKeeper:PT8Sb6Exg9YyPCS7fYraLCsqzR8= 即可。
创建节点假设还是以 laoxun:kaixin 的模式,然后通过管理员的密码也能进行正常的访问
ZooKeeper client = new ZooKeeper("127.0.0.1:2181", 3000, null); client.addAuthInfo("digest", "HelloZooKeeper:niubi".getBytes()); // 1. byte[] data = client.getData("/abc", false, null); System.out.println(new String(data)); // test client.close();这里可以看到 1 处的 Super 模式本质上还是 Digest,指定的 scheme 为 digest,然后之后的 id 取值采用的是明文,而非编码后的格式,切记!
3.3 Permission 汇总表格我这里列出大部分服务端提供的操作对应的 Permission 权限:
操作 所需权限 描述create 父节点的 CREATE 创建节点
create2 父节点的 CREATE 创建节点,同时返回节点数据
createContainer 父节点的 CREATE 创建容器节点
createTTL 父节点的 CREATE 创建带超时时间的节点
delete 父节点的 DELETE 删除节点
setData 当前节点的 WRITE 设置节点数据
setACL 当前节点的 ADMIN 设置节点的权限信息
reconfig 当前节点的 WRITE 重新设置一些配置(之后有机会介绍)
getData 当前节点的 READ 查询节点数据
getChildren 当前节点的 READ 获取子节点列表
getChildren2 当前节点的 READ 获取子节点列表
getAllChildrenNumber 当前节点的 READ 获取所有子节点(包含孙子节点)数量
getACL 当前节点的 ADMIN 或 READ 获取节点的权限信息
可以看到删除和创建节点看的是父节点的权限,只有读写才是看的自己本身的权限。另外如果表格中没有出现的操作可以认为不需要 ACL 权限校验,其他要么是只需要客户端是一个合法的 session 或者本身是一些比较特殊的功能,例如:createSession、closeSession 等。至于关于 session 的更多内容,留到下一篇再讲吧~哈哈
3.4 ACL 背后的原理我们刚刚花了一点篇幅介绍了 ACL 是什么,怎么用?现在深入了解下 ACL 在 ZK 的服务端底层是怎么去实现的吧~为了节约篇幅,这次就直接进入猿话讲解了。
首先祭出之前的一张图,唤醒下大家的记忆