zookeeper使用acl進行訪問控制
阿新 • • 發佈:2019-01-04
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