如何使用 zkCli 从 ZooKeeper 访问受保护的 znode?

dgm*_*dgm 5 apache-zookeeper

我使用以下命令创建了一个 znode:

zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh create /mynode content digest:user:pass:cdrwa
Run Code Online (Sandbox Code Playgroud)

现在如何使用 zkCli.sh 实用程序访问 znode?

zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh get /mynode
Connecting to localhost:2181

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
Authentication is not valid : /mynode
zookeeper-0:/opt/zookeeper/bin #
Run Code Online (Sandbox Code Playgroud)

getAcl 显示以下内容:

zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh getAcl /mynode
Connecting to localhost:2181

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
'digest,'user:pass
: cdrwa
zookeeper-0:/opt/zookeeper/bin #
Run Code Online (Sandbox Code Playgroud)

zsl*_*ltg 7

您需要使用散列密码创建摘要 ACL。

ZooKeeper 程序员指南

摘要使用用户名:密码字符串生成 MD5 哈希值,然后将其用作 ACL ID 身份。身份验证是通过以明文形式发送用户名:密码来完成的。当在 ACL 中使用时,表达式将是用户名:base64 编码的 SHA1 密码摘要。

生成哈希密码

$ java -cp "./zookeeper-3.4.13.jar:./lib/slf4j-api-1.7.25.jar" \
org.apache.zookeeper.server.auth.DigestAuthenticationProvider user:pass
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
user:pass->user:smGaoVKd/cQkjm7b88GyorAUz20=
Run Code Online (Sandbox Code Playgroud)

使用哈希密码创建节点

[zk: zookeeper(CONNECTED) 0] create /mynode content digest:user:smGaoVKd/cQkjm7b88GyorAUz20=:cdrwa
Created /mynode
Run Code Online (Sandbox Code Playgroud)

访问受保护节点

[zk: zookeeper(CONNECTED) 1] get /mynode
Authentication is not valid : /mynode
[zk: zookeeper(CONNECTED) 2] addauth digest user:pass
[zk: zookeeper(CONNECTED) 3] get /mynode
content
cZxid = 0x14
ctime = Wed Sep 12 19:37:48 GMT 2018
mZxid = 0x14
mtime = Wed Sep 12 19:37:48 GMT 2018
pZxid = 0x14
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的回答但是,我仍然遇到问题,当我使用单个会话时它工作正常。例如, [zk: localhost:2181(CONNECTED) 1] addauth 摘要 user:pass [zk: localhost:2181(CONNECTED) 2] get /mynode 内容工作正常,但是,当我尝试按如下方式获取它时 - Zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh addauth 摘要 user:pass 连接到 localhost:2181 Zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh get /mynode :身份验证无效: /mynode Zookeeper-0:/opt/zookeeper/bin # (2认同)
  • @dgm 那是因为你需要对每个会话进行身份验证,如果你想通过一步,你可以将你的命令放入一个文件中,然后重定向 `zkCli.sh <commands` 或使用单行 `printf " 将它们输入addauth 摘要用户:pass\nget /mynode | zkCli.sh"`,尽管将密码存储在文件中或将其作为参数包含在命令中通常不是一个好主意 (2认同)