zookeeper使用acl进行访问控制

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值