Zookeeper使用ACL來控制訪問Znode,ACL的實現和UNIX的實現非常相似:它采用權限位來控制那些操作被允許,那些操作被禁止。但是和標準的UNIX權限不同的是,Znode沒有限制用戶(user,即文件的所有者),組(group)和其他(world)。Zookeepr是沒有所有者的概念的。
每個ZNode的ACL是獨立的,且子節點不會繼承父節點的ACL。例如:Znode /app對于ip為172.16.16.1只有只讀權限,而/app/status是world可讀,那么任何人都可以獲取/app/status;所以在Zookeeper中權限是沒有繼承和傳遞關系的,每個Znode的權限都是獨立存在的。
Zookeeper支持可插拔的權限認證方案,分為三個維度:scheme,user,permission。通常表示為scheme:id,permissions,其中Scheme表示使用何種方式來進行訪問控制,Id代表用戶,Permission表示有什么權限。下面分別說說這三個維度:
ZooKeeper支持如下權限(permissions):
· CREATE:可以創建子節點
· READ:可以獲取該節點的數據,也可以讀取該節點所有的子節點。
· WRITE:可以寫數據到該節點。
· DELETE:可以刪除子節點。
·ADMIN:可以在該節點中設置權限。
簡單來說,zookeeper的這5種操作權限,CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、刪、改、查、管理權限,這5種權限簡寫為crwda(即:每個單詞的首字符縮寫)
注:這5種權限中,delete是指對子節點的刪除權限,其它4種權限指對自身節點的操作權限
內置的ACL Schemes:
world: 只有一個id:anyone,world:anyone表示任何人都有訪問權限,Zookeeper把任何人都有權限的節點都歸屬于world:anyone
auth:不需要任何id, 只要是通過auth的user都有權限
digest: 使用用戶名/密碼的方式驗證,采用username:BASE64(SHA1(password))的字符串作為ACL的ID
ip: 使用客戶端的IP地址作為ACL的ID,設置的時候可以設置一個ip段,比如ip:192.168.1.0/16, 表示匹配前16個bit的IP段
sasl:sasl的對應的id,是一個通過sasl authentication用戶的id,zookeeper-3.4.4中的sasl authentication是通過kerberos來實現的,也就是說用戶只有通過了kerberos認證,才能訪問它有權限的node.
如果需要實現自己定義的Scheme,可以實現org.apache.zookeeper.server.auth.AuthenticationProvider接口。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
@Test public void testAclServer() { try { Id id1 = new Id( "digest" , DigestAuthenticationProvider.generateDigest( "fish:fishpw" )); ACL acl1 = new ACL(ZooDefs.Perms.WRITE, id1); Id id2 = new Id( "digest" , DigestAuthenticationProvider.generateDigest( "qsd:qsdpw" )); ACL acl2 = new ACL(ZooDefs.Perms.READ, id2); acls.add(acl1); acls.add(acl2); // 所有用戶都有權限 // Id world = new Id("world", "anyone"); // ACL worldAcl = new ACL(ZooDefs.Perms.READ, world); // acls.add(worldAcl); // 10.0.2.76是本機IP // Id id3 = new Id("ip", "10.0.2.76"); // ACL acl3 = new ACL(ZooDefs.Perms.WRITE, id3); // acls.add(acl3); } catch (NoSuchAlgorithmException e1) { e1.printStackTrace(); } ZooKeeper zk = null ; try { zk = new ZooKeeper( "10.0.1.75:2181,10.0.1.76:2181,10.0.1.77:2181" , 300000 , new Watcher() { // 監控所有被觸發的事件 public void process(WatchedEvent event) { System.out.println( "已經觸發了" + event.getType() + "事件!" ); } }); if (zk.exists( "/test" , true ) == null ) { System.out.println(zk.create( "/test" , "ACL測試" .getBytes(), acls, CreateMode.PERSISTENT)); } } catch (IOException e) { e.printStackTrace(); } catch (KeeperException e1) { e1.printStackTrace(); } catch (InterruptedException e1) { e1.printStackTrace(); } } @Test public void testAclClient() { try { ZooKeeper zk = new ZooKeeper( "10.0.1.75:2181,10.0.1.76:2181,10.0.1.77:2181" , 300000 , new Watcher() { // 監控所有被觸發的事件 public void process(WatchedEvent event) { System.out.println( "已經觸發了" + event.getType() + "事件!" ); } }); // 只有寫權限 zk.addAuthInfo( "digest" , "fish:fishpw" .getBytes()); // 只有讀權限 zk.addAuthInfo( "digest" , "qsd:qsdpw" .getBytes()); System.out.println( new String(zk.getData( "/test" , null , null ))); zk.setData( "/test" , "I change!" .getBytes(), - 1 ); } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } |
總結
以上就是本文關于為zookeeper配置相應的acl權限的全部內容,希望對大家有所幫助。有什么問題可以留言,小編會及時回復大家的,在此也感謝大家對本站的支持。
原文鏈接:http://blog.csdn.net/qianshangding0708/article/details/50114671