配置存储不仅维护了一个树结构,还对各个节点添加了权限控制。
类图
DataTree内部维护两个hashmap,来管理权限和一个long的关联关系,然后在节点中存储该long值。
public final Map<Long, List<ACL>> longKeyMap = new HashMap<Long, List<ACL>>(); public final Map<List<ACL>, Long> aclKeyMap = new HashMap<List<ACL>, Long>(); public String createNode(String path, byte data[], List<ACL> acl, long ephemeralOwner, long zxid, long time) throws KeeperException.NoNodeException, KeeperException.NodeExistsException { int lastSlash = path.lastIndexOf(‘/‘); String parentName = path.substring(0, lastSlash); String childName = path.substring(lastSlash + 1); ... DataNode parent = nodes.get(parentName); ... synchronized (parent) { Set<String> children = parent.getChildren(); ... Long longval = convertAcls(acl); DataNode child = new DataNode(parent, data, longval, stat); parent.addChild(childName); nodes.put(path, child); ... } public Stat setACL(String path, List<ACL> acl, int version) throws KeeperException.NoNodeException { Stat stat = new Stat(); DataNode n = nodes.get(path); ... n.acl = convertAcls(acl); ... } public List<ACL> getACL(String path, Stat stat) throws KeeperException.NoNodeException { DataNode n = nodes.get(path); ... return new ArrayList<ACL>(convertLong(n.acl)); ... }
ACL存储了权限信息。perms以位方式存储了以下几种权限:
1.是否允许对子节点Create操作
2.是否允许本节点GetChildren和GetData操作
3.是否允许对本节点SetData操作
4.是否允许对子节点Delete操作
5.是否允许对本节点setAcl操作
schema存储的验证方式,id是验证的值。有以下几种验证方式:
1.digest:Client端由用户名和密码验证,譬如user:password,digest的密码生成方式是Sha1摘要的base64形式
2.auth:不使用任何id,代表任何已确认用户。
3.ip:Client端由IP地址验证,譬如172.2.0.0/24
4.world:固定用户为anyone,为所有Client端开放权限
5. super:在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)
public class ACL implements Record { private int perms; private org.apache.zookeeper.data.Id id; }
public class Id implements Record { private String scheme; private String id; }