使用CuratorFramework,有人可以解释我该如何做:
使用用户名
foo
和密码bar
吗?那些不知道该用户/通行证的人将无能为力。对于这个问题,我不在乎通过纯文本发送SSL或密码。
最佳答案
Apache Curator中的ACL用于访问控制。因此,ZooKeeper不提供任何身份验证机制,例如clients who don't have correct password cannot connect to ZooKeeper or cannot create ZNodes
。它可以做的是防止未经授权的客户端访问特定的Znode/ZNode。为了做到这一点,您必须设置我下面描述的CuratorFramework实例。请记住,这将确保使用给定ACL创建的ZNode可以被同一客户端或提供相同身份验证信息的客户端再次访问。
首先,您应该按照以下方式构建CuratorFramework
实例。在这里,connectString
表示以逗号分隔的集合中Zookeeper服务器的ip and port
组合列表。
CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
.connectString(connectString)
.retryPolicy(new ExponentialBackoffRetry(retryInitialWaitMs, maxRetryCount))
.connectionTimeoutMs(connectionTimeoutMs)
.sessionTimeoutMs(sessionTimeoutMs);
/*
* If authorization information is available, those will be added to the client. NOTE: These auth info are
* for access control, therefore no authentication will happen when the client is being started. These
* info will only be required whenever a client is accessing an already create ZNode. For another client of
* another node to make use of a ZNode created by this node, it should also provide the same auth info.
*/
if (zkUsername != null && zkPassword != null) {
String authenticationString = zkUsername + ":" + zkPassword;
builder.authorization("digest", authenticationString.getBytes())
.aclProvider(new ACLProvider() {
@Override
public List<ACL> getDefaultAcl() {
return ZooDefs.Ids.CREATOR_ALL_ACL;
}
@Override
public List<ACL> getAclForPath(String path) {
return ZooDefs.Ids.CREATOR_ALL_ACL;
}
});
}
CuratorFramework client = builder.build();
现在您必须启动它。
client.start();
创建路径。
client.create().withMode(CreateMode.PERSISTENT).forPath("/your/ZNode/path");
在这里,
CreateMode
指定要创建的节点类型。可用的类型为PERSISTENT,EPHEMERAL,EPHEMERAL_SEQUENTIAL,PERSISTENT_SEQUENTIAL,CONTAINER
。 Java Docs如果不确定到
/your/ZNode
的路径是否已经存在,也可以创建它们。client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/your/ZNode/path");
设置数据
您可以在创建ZNode或更高版本时设置数据。如果在创建时设置数据,请将数据作为
byte
数组作为第二个参数传递给forPath()
方法。client.create().withMode(CreateMode.PERSISTENT).forPath("/your/ZNode/path","your data as String".getBytes());
如果稍后再做,(数据应以字节数组形式给出)
client.setData().forPath("/your/ZNode/path",data);
最后
我不明白
get this path
是什么意思。 Apache Curator
是一个Java客户端(比Curator Recipes更多),它在后台使用Apache Zookeeper
并隐藏了Zookeeper的极端情况和复杂性。在Zookeeper中,他们使用ZNodes
的概念来存储数据。您可以将其视为Linux目录结构。所有ZNodePaths
应该以/
(根)开头,并且您可以继续指定ZNodePaths之类的目录。例如:/someName/another/test/sample
。如上图所示,ZNode以树结构组织。每个
ZNode
最多可以存储1MB的数据。因此,如果要检索存储在ZNode中的数据,则需要知道该ZNode的路径。 (就像您应该知道数据库的表和列以便检索数据一样)。如果您要检索给定路径中的数据,
client.getData().forPath("/path/to/ZNode");
这就是您想与Curator合作的全部内容。
还有一件事
Apache Curator中的ACL用于访问控制。也就是说,如果您将
ACLProvider
设置如下,new ACLProvider() {
@Override
public List<ACL> getDefaultAcl () {
return ZooDefs.Ids.CREATOR_ALL_ACL;
}
@Override
public List<ACL> getAclForPath (String path){
return ZooDefs.Ids.CREATOR_ALL_ACL;
}
}
稍后,只有具有与创建者相同的凭据的客户端才可以访问相应的ZNode。认证的详细信息设置如下(请参阅客户端构建示例)。还有其他ACL模式可用,例如
OPEN_ACL_UNSAFE
,如果将其设置为ACLProvider,则不执行任何访问控制。authorization("digest", authorizationString.getBytes())
它们将在以后用于控制对给定ZNode的访问。
简而言之,如果要防止其他人干扰您的ZNode,可以将ACLProvider设置为返回
CREATOR_ALL_ACL
,并将授权设置为digest
,如上所示。只有使用相同授权字符串("username:password"
)的CuratorFramework实例才能访问这些ZNode。但这不会阻止其他人在不干扰您的路径中创建ZNode。希望你找到了想要的东西:-)
关于java - 与Curator一起使用ACL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40427700/