Zookeeper Java 授权操作(二)

前面章节介绍了 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” 节点的数据,并打印出来。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号