zookeeper節點權限介紹

《zookeeper介紹及環境搭建》《zookeeper客戶端的使用》《zookeeper java api介紹》三篇文章中,分別介紹了ZooKeeper的實驗環境搭建ZooKeeper的數據結構ZooKeeper客戶端的使用ZooKeeper提供的Java API。本篇文章咱們將詳細討論ZooKeeper的另外一個重要概念——ZooKeeper的節點權限。java

ZooKeeper節點權限基本概念

ZooKeeper節點的數據結構很是相似於Linux文件系統的結構。在Linux文件系統中,每一個文件或目錄針對不一樣的用戶和用戶組都具備相應的rwx權限。一樣的,在ZooKeeper中,每一個節點針對不一樣的用戶或主機也具備相應的權限。下面咱們來看下ZooKeeper中節點權限的基本概念。apache

  1. 權限模式schema
    在ZooKeeper中,權限模式schema有兩種類型,分別是ip和digest。
    ip模式是基於ip白名單的方式指定某個服務器具備哪些權限。
    digest模式是基於用戶名和密碼的方式指定哪一個人具備什麼樣的權限。
  2. 受權對象ID
    在ip權限模式下,ID就是具體的ip地址字符串。
    在digest權限模式下,ID是username:Base64(Sha1(username:password))字符串。
  3. 權限permission
    在ZooKeeper中,有create(c)、delete(d)、read(r)、write(w)和admin(a)這五種權限類型。

在ZooKeeper中,就是經過schema、ID和permission指定一個節點的權限信息。編程

權限對象ACL

在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());
相關文章
相關標籤/搜索