前面章节介绍了 digest 身份验证方案,并且通过实际代码演示了如何运用,下面将介绍如何使用 auth 身份验证方案,完整代码如下:
package com.hxstrive.zookeeper; import com.alibaba.fastjson.JSONObject; import org.apache.zookeeper.*; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Id; import org.apache.zookeeper.data.Stat; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; /** * 添加授权信息 * @author hxstrive.com */ public class AuthInfoNode2 { private static ZooKeeper zooKeeper; @Before public void init() throws Exception { CountDownLatch countDownLatch = new CountDownLatch(1); zooKeeper = new ZooKeeper("127.0.0.1:2181", 2000, new Watcher() { public void process(WatchedEvent watchedEvent) { // 连接成功后添加认证信息 if(watchedEvent.getState() == Event.KeeperState.SyncConnected) { // 添加权限,zk 客户端库会自动对密码进行加密处理 zooKeeper.addAuthInfo("digest", "test:123456".getBytes()); System.out.println("添加权限到客户端连接"); countDownLatch.countDown(); } } }); // 等待连接创建成功 countDownLatch.await(); } @Test public void createNode() throws Exception { // 创建一个带权限的节点 List<ACL> acl = new ArrayList<>(); // 注意,使用 auth 身份验证模式,id 填写用户名 test 即可 Id id = new Id("auth", "test"); acl.add(new ACL(ZooDefs.Perms.ALL, id)); String result = zooKeeper.create("/auth_node4", "new value".getBytes(), acl, CreateMode.PERSISTENT); System.out.println("创建节点:" + result); //输出: //添加权限到客户端连接 //创建节点:/auth_node4 } @Test public void getNodeData() throws Exception { // 获取节点内容 Stat stat = new Stat(); byte[] data = zooKeeper.getData("/auth_node4", false, stat); System.out.println("节点内容:" + new String(data)); System.out.println(JSONObject.toJSONString(stat)); //输出: //添加权限到客户端连接 //节点内容:new value //{"aversion":0,"ctime":1704092893693,"cversion":0,"czxid":398,"dataLength":9,"ephemeralOwner":0, // "mtime":1704092893693,"mzxid":398,"numChildren":0,"pzxid":398,"version":0} } }
在上面的示例中,我们创建了一个 ZooKeeper 会话,并在会话连接成功后,使用 addAuthInfo() 方法添加了具有权限的节点所需的认证信息。然后,我们使用 createNode() 方法创建节点(注意,在创建节点时需要指定 ACL 列表),使用 getData() 方法获取了 “/auth_node4” 节点的数据,并打印出来。