在《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());