概念理解
- zookeeper权限设置只是针对固定的一个节点,子节点不会继承父节点的权限。
- 权限ACL组成为(scheme:id, perms)构成,具体上网查询分别代表什么意思;
- 客户端创建节点时候可以指定ArrayList集合,代码如下;
ACL acl = new ACL();
acl.setPerms(Perms.READ);
Id id = new Id();
id.setId(DigestAuthenticationProvider.generateDigest("admin:admin123"));
id.setScheme("digest");
acl.setId(id);
ArrayList<ACL> list = new ArrayList<ACL>();
list.add(acl);
zk.create("/acl", "helloWorld".getBytes(),list, CreateMode.PERSISTENT);
实现原理
- 创建节点时候,若指定了ACL的list,那么会把list放入DataTree类的一个MAP里面作为value值,依次递增返回一个KEY的INT值,然后把此值存储到当前节点的DataNode对象里面;
- 客户端请求时候,依据PATH路径从DataTree里面获取到当前节点的DataNode对象,(需要注意的是当服务启动的时候,会把磁盘上所有的文件数据加载到DataTree对象里即内存里面,所有数据的读取全是内存级别的。)然后依据DataNode的ACL的KEY值从MAP里面获取到ACL集合,这样就可以与客户端传递过来的权限做比对了。
关键几个类
- 创建节点时候:DataTree的createNode函数;
- 权限校验:PrepRequestProcessor类,pRequest2Txn和checkACL函数体