ZooKeeper 的 ACL 默认是完全开放的。这篇从默认值开始,用 digest 保护一个节点,再把五种权限逐一拆开测:谁能读、谁能写、谁能创建 / 删除子节点、谁能改 ACL。
/open 的 ACL: [('world', 'anyone', 31)] (perms=31 = ALL)
匿名连接:读 /open → 成功:b'hello'
匿名连接:写 /open → 成功:ZnodeStat(czxid=3, mzxid=4, ctime=179082
匿名连接:删 /open → 成功 /secret 的 ACL: [('digest', 'admin:B05meOaFZGavGA/rJPCQlodOTYU=', 31)]
匿名:读 /secret → NoAuthError
匿名:写 /secret → NoAuthError
匿名:读 ACL /secret → NoAuthError
匿名:改 ACL /secret → NoAuthError
匿名:列子节点 /secret → NoAuthError
匿名:创建子节点 /secret → NoAuthError
匿名:删子节点 /secret → NoAuthError
已认证 admin:读 /secret → 成功:b'top'
已认证 admin:写 /secret → 成功:ZnodeStat(czxid=6, mzxid=11, ctime=17908
已认证 admin:读 ACL /secret → 成功
已认证 admin:改 ACL /secret → 成功
已认证 admin:列子节点 /secret → 成功:[]
已认证 admin:创建子节点 /secret → 成功:/secret/c
已认证 admin:删子节点 /secret → 成功 reader {'get': '允许', 'set': '拒绝(NoAuth)', 'create_child': '拒绝(NoAuth)', 'delete_child': '拒绝(NoAuth)', 'set_acl': '拒绝(NoAuth)'}
writer {'get': '允许', 'set': '允许', 'create_child': '拒绝(NoAuth)', 'delete_child': '拒绝(NoAuth)', 'set_acl': '拒绝(NoAuth)'}
maker {'get': '允许', 'set': '拒绝(NoAuth)', 'create_child': '允许', 'delete_child': '拒绝(NoAuth)', 'set_acl': '拒绝(NoAuth)'}
deleter {'get': '允许', 'set': '拒绝(NoAuth)', 'create_child': '拒绝(NoAuth)', 'delete_child': '允许', 'set_acl': '拒绝(NoAuth)'}表里每一行都是一个只有那一种(加 READ)权限的用户做的真实尝试。