1. 程式人生 > >zookeeper使用acl進行訪問控制

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