zookeeper源码之权限控制

Posted zhangwanhua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zookeeper源码之权限控制相关的知识,希望对你有一定的参考价值。

  配置存储不仅维护了一个树结构,还对各个节点添加了权限控制。

类图

 技术分享图片

  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;
 }

 

以上是关于zookeeper源码之权限控制的主要内容,如果未能解决你的问题,请参考以下文章

nacos源码之Auth(权限)模块-1(授权过滤器与控制器缓存)

权限框架之Shiro详解

nacos源码之Auth(权限)模块-2(权限管理与权限配置)

nacos源码之Auth(权限)模块-2(权限管理与权限配置)

JAVA基础之訪问控制权限(封装)

JAVA基础之訪问控制权限(封装)