ZooKeeper编程指南(四)

ZooKeeper编程指南(四)  

访问控制
    zk使用ACLs(access control list)来控制对节点的访问。ACL实现类似于unix的文件权限控制:使用权限位来 允许/禁止 对节点的各种操作和一些位的作用范围。不像unix权限,zk节点不受限于3个标准的范围 -- 用户(owner),组,其它(world)。zk没有节点拥有者的概念。相反ACL指定id集合和id集合对应的权限。

    注意到一个ACL仅仅属于一个具体的节点,特别的它并不能应用于子节点。例如,/app仅仅对ip:172.16.16.1可读,同时/app/status对任何ip可读,那么任何ip可读/app/status。ACLs并不是递归的。

    zk支持可插拔的认证方案。Ids(标识符,标识客户端的id,id的组合)使用这种形式scheme:id,scheme是id对应的认证方案。例如 ip:172.16.16.1就是一个id,对应一个ip地址为 172.16.16.1的主机。

    当客户端连接到zk认证自己时,zk把所有的客户端对应的ids(这些ids应该是zk服务器根据客户端的相关属性生成的,比如ip)(也就代表当前客户端的权限)关联到当前连接上。当访问节点时,ids和节点的访问控制列表对比。访问控制列表(表示节点权限)由成对的(scheme:expression, perms)组成。表达式(expression)的格式特定于scheme(和scheme对应)。例如,(ip:19.22.0.0/16, READ) 表示:任何ip地址以19.22开头的客户端都有读权限。

ACL权限
    zk支持下面的权限
    1、CREATE  创建子节点
    2、READ  获取节点data和节点的子节点
    3、WRITE  设置节点data
    4、DELETE  删除子节点
    5、设置权限

    CREATE和DELETE权限从WRITE权限中脱离是为了更细粒度的权限控制。 CREATE和DELETE的场景如下:
    希望A能够设置节点的数据,但不能够创建或删除该节点子节点。

    有CREATE没有DELETE:客户端通过在父目录创建节点来生成请求(这个客户端就是处理请求的客户端)。希望所有的客户端都能添加,只有request processor(创建父节点的客户端)能够删除(类似于文件系统的追加APPEND操作)。

    有ADMIN权限是因为zk没有文件所有者的概念。在某种意义上,ADMIN权限制定某个实体(entity,个体)为拥有者。zk不支持LOOKUP权限(目录的查询权限位支持LOOKUP操作,即使没有列出目录的权限)。所有的用户隐含都有LOOKUP的权限,这允许用户获取节点状态,仅仅只有这些(有一个问题是,在不存在的节点上执行 zoo_exists(),这种操作不允许 )。

内置方案    zk有下面的内置方案
    1、world,有唯一的id,“anyone”,表示任何用户(客户端)
    2、auth,不适用任何id,表示任何授权的用户
    3、digest,ca,感觉这块的官方文档说的不清楚。
    4、ip,使用客户端ip作为id,acl的表达式形式是 addr/bits,addr的最高有效位bits个和客户端ip的最高有效位bits个匹配。
    
可扩充的认证
    zk使用不同的认证方案,运行在不同的环境中。因此他又一个完全可扩充的认证框架。即使内部的认证方案,也使用了可扩充的认证框架。

    要理解认证框架如何工作,首先必须理解两个主要的认证操作。框架首先认证客户端。当客户端连接到服务器时就开始认证,包括客户端发送的信息和从客户端收集的信息,并且关联到连接。框架执行的第二个操作是找到ACL中和客户端对应的一个条目。ACL条目是<idspec, permissions>的形式。idspec可能是简单的字符串,直接可以和连接里面的认证信息对比,也可能是一个表达式,和连接里的信息进行计算。认证插件的实现负责匹配。
下面是认证插件必须实现的接口:
public interface AuthenticationProvider {
    String getScheme();
    KeeperException.Code handleAuthentication(ServerCnxn cnxn, byte authData[]);
    boolean isValid(String id);
    boolean matches(String id, String aclExpr);
    boolean isAuthenticated();
}

    getScheme()返回认证插件的标识符。因为我们支持多种认证方法。认证的凭据或idspec必须追加scheme的前缀。zk服务器使用认证插件返回的方案来确定方案应用的ids。
   
    当客户端发送认证信息,handleAuthentication ()被调用。客户端指定信息对应的方案。服务器传递信息到认证插件(getScheme()返回的和客户端传递的相同)。 handleAuthentication ()方法会在确定信息错误时返回error,否则它会关联信息到连接(使用 cnxn.getAuthInfo().add(new Id(getScheme(), data)) )。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值