Zookeeper不具有znode的拥有者的概念,相反,ACL指定id集以及与之对应的权限。还要注意的是一条ACL仅针对一个特定的节点,不适用于子节点,例如:如果/app只对ip:172.16.16.1可读,而/app/status是对任何人可读,acl不是递归的。
ACL是由scheme:expression,perms构成,例如:
ip:19.2.0.0./16, READ
zookeeper内置schemas:
- world:有个唯一的id,anyone,代表所有人。
- auth:不使用任何id,代表任何已认证的用户
- digest:用username:password字符串来产生一个MD5串,然后该串被用来作为ACL ID。认证是通过明文发送username:password来进行的,当用在ACL时,表达式为username:base64,base64是password的SHA1接要的编码。
- ip:使用客户羰的主机IP作为ACL ID,这个ACL表达式的格式为addr/bits,此时addr中的有效们与客户端addr中的有效位进行对比。
zookeeper支持以下权限:
- CREATE:能创建子节点
- READ:能获取节点数据和列出其子节点
- WRITE:能设置节点数据
- DELETE:能删除子节点
- ADMIN:能设置权限
digest使用示例:
创建节点数据时
List<ACL> acls = new ArrayList<ACL>(2);
Id id1 = new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin123"));
ACL acl1 = new ACL(ZooDefs.Perms.ALL, id1);
Id id2 = new Id("digest", DigestAuthenticationProvider.generateDigest("guest:guest123"));
ACL acl2 = new ACL(ZooDefs.Perms.READ, id2);
acls.add(acl1);
acls.add(acl2);
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 10000, new DefaultWatcher());
zk.create("/test", new byte[0], acls, CreateMode.PERSISTENT);
登录Zookeeper读取节点数据时
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 10000, new DefaultWatcher());
zk.addAuthInfo("digest", "guest:guest123".getBytes());
byte[] value = zk.getData("/test", null, new Stat());
这样对Zookeeper上的节点数据设置多个用户,用于不同的权限操作。
最后欢迎大家访问我的个人网站:1024s