这里我只用了基于用户名密码的digest 模式,还有world auth ip 三种模式
ZooKeeper有下列内建模式:
- world 有独立id,anyone,代表任何用户。
- auth 不使用任何id,代表任何已经认证过的用户
- digest 之前使用了格式为username:pathasowrd的字符串来生成一个MD5哈希表作为ACL ID标识。在空文档中发送username:password来完成认证。现在的ACL表达式格式为username:base64, 用SHA1编码密码。
- ip 用客户端的ip作为ACL ID标识。ACL表达式的格式为addr/bits,addr中最有效的位匹配上主机ip最有效的位。
可以根据自己的需要自己进行选择使用
@Test public void test() throws IOException, InterruptedException, KeeperException, NoSuchAlgorithmException { /** * 连接zookeeper */ zk = new ZooKeeper("localhost:2182", 5000, new Watcher() { public void process(WatchedEvent event) { if (event.getType() == EventType.NodeChildrenChanged && ("/" + groupNode).equals(event.getPath())) { try { System.out.println("此处监听"); } catch (Exception e) { e.printStackTrace(); } } } }); while(zk.getState() != ZooKeeper.States.CONNECTED ){ Thread.sleep(3000); } //zk链接的用户 zk.addAuthInfo("digest", "admin:admin123".getBytes()); //创建开放节点,允许任意操作 zk.create("/xxx", "xxx".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); //创建只读节点 zk.create("/yyy", "yyy".getBytes("utf-8"), Ids.READ_ACL_UNSAFE, CreateMode.PERSISTENT); //创建者全部权限 zk.create("/zzzs", "zzz".getBytes("utf-8"), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT); //设置访问权限列表 List<ACL> lists = new ArrayList<ACL>(); Id id1 = new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin123")); Id id3 = new Id("digest", DigestAuthenticationProvider.generateDigest("readadmin:admin123")); lists.add(new ACL(ZooDefs.Perms.CREATE,id1)); //创建权限 lists.add(new ACL(ZooDefs.Perms.READ,id3)); //只读权限 //testa 节点将根据权限列表进行acl zk.create("/testa", "testacl".getBytes("utf-8"), lists, CreateMode.PERSISTENT); byte[] value = zk.getData("/testa", null, new Stat()); System.out.println(value); }
时间: 2024-10-09 15:25:55