Zookeeper的ACL授权中auth和digest两种scheme的区别

2019-01-04 12:12:59

Zookeeper的ACL授权中auth和digest两种scheme的区别

auth

我的理解就是这种授权方式属于一对多。把一个节点的操作权限,授权给系统中所有的认证用户。

添加用户信息到系统

语法:addauth digest [user]:[pass]

user pass就是用户名和密码(明文)

  1. addauth digest user1:123456
  2. addauth digest user2:654321
  3. addauth digest user3:111111

创建节点并且设置auth授权

  1. # 创建节点
  2. [zk: localhost:2181(CONNECTED) 9] create /node1 javaweb
  3. Created /node1
  4. # 设置ACL授权
  5. [zk: localhost:2181(CONNECTED) 10] setAcl /node1 auth::cdrwa
  6. cZxid = 0x200000071
  7. ctime = Fri Jan 04 11:48:20 CST 2019
  8. mZxid = 0x200000071
  9. mtime = Fri Jan 04 11:48:20 CST 2019
  10. pZxid = 0x200000071
  11. cversion = 0
  12. dataVersion = 0
  13. aclVersion = 1
  14. ephemeralOwner = 0x0
  15. dataLength = 7
  16. numChildren = 0
  17. # 查看授权信息
  18. [zk: localhost:2181(CONNECTED) 12] getAcl /node1
  19. 'digest,'user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=
  20. : cdrwa
  21. 'digest,'user2:R57WpDHD9QZRdp+vRmoJmoUZKws=
  22. : cdrwa
  23. 'digest,'user3:v2lIlgrn+/R9+zNneTNAUIAEiHc=
  24. : cdrwa
  • 执行auth的授权操作时, 不用写用户名和密码。因为这种授权方式本身就是授权给系统中所有认证用户的(也就是前面添加的用户)
  • 查看znode的acl权限,可以看到这个节点已经授权给了上一步添加的所有用户,密码被hash运算过。不是明文。

digest

一对一的授权方式。把一个节点的操作权限,授权给系统中指定的证用户。

添加用户信息到系统

略,看上文

创建节点并且设置digest授权

  1. # 创建节点
  2. [zk: localhost:2181(CONNECTED) 13] create /node2 Hello
  3. Created /node2
  4. # 设置 digest授权
  5. [zk: localhost:2181(CONNECTED) 14] setAcl /node2 digest:user3:v2lIlgrn+/R9+zNneTNAUIAEiHc=:cdrwa
  6. cZxid = 0x200000073
  7. ctime = Fri Jan 04 12:01:49 CST 2019
  8. mZxid = 0x200000073
  9. mtime = Fri Jan 04 12:01:49 CST 2019
  10. pZxid = 0x200000073
  11. cversion = 0
  12. dataVersion = 0
  13. aclVersion = 1
  14. ephemeralOwner = 0x0
  15. dataLength = 5
  16. numChildren = 0
  17. # 查看授权信息
  18. [zk: localhost:2181(CONNECTED) 15] getAcl /node2
  19. 'digest,'user3:v2lIlgrn+/R9+zNneTNAUIAEiHc=
  20. : cdrwa
  21. [zk: localhost:2181(CONNECTED) 16]
  • 执行digest授权的时候,需要指定用户名和密码。密码需要通过BASE64(SHA1(密码))运算
  • 查询acl权限的时候,可以看到该节点仅仅被授权给了指定的用户

如何获取到用户的密码密文?

  • 如果你已经知道了原始密码,可以使用zk客户端提供的工具类来获取到加密后的密文
  1. String digest = DigestAuthenticationProvider.generateDigest("kevin:123456");
  2. //kevin:GSivD5W51c7Wm5vFWnFp1IYOVTY=
  • 如果你不知道原始密码,可以尝试去读取该用户有权限的znode节点的acl信息,从acl信息里面获取到密文

Java客户端的操作

不论是auth还是digest授权,客户端都需要添加授权信息

  1. ZooKeeper zooKeeper = new ZooKeeper("192.168.2.201:2181",Integer.MAX_VALUE,new DefaultWatcher("zookeeper"));
  2. //添加授权信息,不论是auth 还是 digest 。这里的 scheme参数统一为 digest
  3. zooKeeper.addAuthInfo("digest", "user3:111111".getBytes());
  4. byte[] data = zooKeeper.getData("/node2", false, null);
  5. System.out.println(new String(data)); //Hello

如果有误,还望指出。


0
0
0

添加评论

正在回复:
取消
0
0
0
0