您的位置:首页 > 其它

ZooKeeper通过Auth和ACL完成节点的权限控制。

2014-08-11 20:45 274 查看
Auth表示某种认证,由于一个ZooKeeper集群可能被多个项目使用,各个项目属于不同的项目组,他们在进行开发时肯定不想其他项目访问与自己相关的节点,这时可以通过为每个项目组分配一个Auth,然后每个项目组先通过Auth认证以后再继续相关的操作,这样甲Auth认证的用户就不能操作其他Auth认证后创建的节点,从而实现各个项目之间的隔离。ZooKeeper提供了如下方法完成认证,如下所示:

Void addAuthInfo(String scheme, byte[] auth) ,使用示例如下:

@Test

public void testFirstStep() {

try {

zk = new ZooKeeper(hostport, 1000000, null);

String auth_type = "digest";

String auth = "joey:some";


String p = "/acl_digest";

zk.addAuthInfo(auth_type, auth.getBytes());

zk.create(p
, "hello".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);

Stat stat = new Stat();

System.out.println(new String(zk.getData(p, false, stat)));

zk.close();

} catch(Exception ex) {

ex.printStackTrace();

}

}

@Test

public void testSecondStep() {

String p = "/acl_digest";

try {

zk = new ZooKeeper(hostport, 1000000, null);

String authType = "digest";

String badAuth = "joey:someBAD"; //String auth = "joey:some";

zk.addAuthInfo(authType, badAuth.getBytes());

Stat stat = new Stat();

System.out.println(new String(zk.getData(p, false, stat)));

} catch(Exception ex) {

ex.printStackTrace(); //抛出异常

} finally {

try {

zk.delete(p, -1);

zk.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

ACL用于控制Znode的访问,和Unix文件访问权限类似,提供对某类用户设置某种权限的能力(如Unix中对Owner提供读、写、执行的权限),但是在ZooKeeper中没有Owner、Group等概念,于是在ZooKeeper中使用ID表示某一类用户,可以对ID设置某种权限。(ZooKeeper对ID的数量没有限制,不像Unix文件仅支持三种类型用户)

ZK内建的ID:

ANYONE_ID_UNSAFE //任意用户

AUTH_IDS //通过Auth认证过的用户

内建的权限控制集合:

OPEN_ACL_UNSAFE: 创建任何人都可以操作的节点

READ_ACL_UNSAFE: 创建任何人都可以读的节点

CREATOR_ALL_ACL: 设置了Auth的用户可以使用该ACL集合创建节点,该节点也只能被同样Auth授权的用户操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: