在《zookeeper介绍及环境搭建》、《zookeeper客户端的使用》和《zookeeper java api介绍》三篇文章中,分别介绍了ZooKeeper的实验环境搭建、ZooKeeper的数据结构、ZooKeeper客户端的使用和ZooKeeper提供的Java API。本篇文章咱们将详细讨论ZooKeeper的另外一个重要概念——ZooKeeper的节点权限。java
ZooKeeper节点的数据结构很是相似于Linux文件系统的结构。在Linux文件系统中,每一个文件或目录针对不一样的用户和用户组都具备相应的rwx权限。一样的,在ZooKeeper中,每一个节点针对不一样的用户或主机也具备相应的权限。下面咱们来看下ZooKeeper中节点权限的基本概念。apache
在ZooKeeper中,就是经过schema、ID和permission指定一个节点的权限信息。编程
在ZooKeeper中,权限的信息是经过org.apache.zookeeper.data.ACL
这个类指定的。ACL类的部分源码以下:segmentfault
public class ACL implements Record { private int perms; private Id id; . . . }
org.apache.zookeeper.data.Id
类的部分源码以下:api
public class Id implements Record { private String scheme; private String id; . . . }
在ACL类中,perms字段对应的就是咱们上面提到的权限(permission)字段。而在Id类中的scheme和id两个字段对应的就是权限模式(schema)和受权对象(ID)。
咱们经过下面的代码,就能够构造一个针对ip的权限对象:服务器
ACL aclIp = new ACL(ZooDefs.Perms.READ | ZooDefs.Perms.WRITE, new Id("ip","192.168.1.110"));
ACL构造函数中的第一个参数是permission信息,能够经过ZooDefs.Perms.READ | ZooDefs.Perms.WRITE
这种方式同时指定多个权限。ACL构造函数的第二个参数是一个Id对象,Id对象中包含了schema和受权对象的信息,这里指定schema采用ip白名单的方式,受权对象是对应的服务器ip地址。
下面的代码能够采用schema为digest的方式构造一个ACL对象:数据结构
String authStr = DigestAuthenticationProvider.generateDigest("poype:123456"); ACL aclDigest = new ACL(ZooDefs.Perms.READ | ZooDefs.Perms.WRITE, new Id("digest",authStr));
这里构造的Id对象采用digest模式构造,authStr是包含用户名和密码信息的字符串。当schema为digest时,受权对象是username:Base64(Sha1(username:password))形式的字符串。为了简化咱们编程,ZooKeeper提供了对应的工具类,咱们能够经过DigestAuthenticationProvider.generateDigest
这个方法生成对应的受权对象字符串。这里poype是用户名,123456是密码。
下面的代码使用构造好的两个ACL对象建立一个zk节点:ide
ArrayList<ACL> acls = new ArrayList<ACL>(); acls.add(aclIp); acls.add(aclDigest); // 建立节点时用acls做为权限信息 String path = zooKeeper.create("/poype", "789".getBytes(), acls, CreateMode.PERSISTENT);
上面构造的/poype节点同时具备aclIp和aclDigest两个对象指定的权限。也就是说,/poype节点能够被ip地址为192.168.1.110的服务器读写,也能够被用户名为poype,密码是123456的用户读写。
此时在一台没有权限的机器上访问/poype节点,就会抛出下面的异常:函数
为了使该服务器能够访问/poype节点,可使用用户名和密码给为该服务器增长受权。工具
使用命令addauth digest poype:123456
增长digest受权。
能够经过下面的代码增长digest受权:
zooKeeper.addAuthInfo("digest","poype:123456".getBytes());