将 ACL 与策展人一起使用
使用CuratorFramework,有人可以解释一下我如何做到:
- 创建新路径
- 设置此路径的数据
- 获取此路径
使用用户名和密码?那些不知道这个用户/通行证的人将无法做任何事情。foo
bar
出于这个问题的目的,我不关心通过明文发送的SSL或密码。
使用CuratorFramework,有人可以解释一下我如何做到:
使用用户名和密码?那些不知道这个用户/通行证的人将无法做任何事情。foo
bar
出于这个问题的目的,我不关心通过明文发送的SSL或密码。
Apache Curator中的ACL用于访问控制。因此,ZooKeeper 不提供任何身份验证机制,如 。它能做的是,防止未经授权的客户端访问特定的Znode / ZNode。为此,您必须设置CuratorFramework实例,如下所述。请记住,这将保证使用给定 ACL 创建的 ZNode 可以由同一客户端或提供相同身份验证信息的客户端再次访问。clients who don't have correct password cannot connect to ZooKeeper or cannot create ZNodes
首先,您应该按如下方式构建 instane。在这里,表示以逗号分隔的集合中 Zookeeper 服务器组合的列表。CuratorFramework
connectString
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");
在此处,指定要创建的节点的类型。可用类型为 。Java DocsCreateMode
PERSISTENT,EPHEMERAL,EPHEMERAL_SEQUENTIAL,PERSISTENT_SEQUENTIAL,CONTAINER
如果不确定到 的路径是否已存在,也可以创建它们。/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);
最后
我不明白你的意思。 是一个java客户端(比Curator Recipes更多),它在后台使用并隐藏了Zookeeper的边缘情况和复杂性。在 Zookeeper 中,他们使用 存储数据的概念。您可以将其视为 Linux 目录结构。所有这些都应该以(root)开头,您可以根据需要继续指定像ZNodePaths这样的目录。前任:。get this path
Apache Curator
Apache Zookeeper
ZNodes
ZNodePaths
/
/someName/another/test/sample
如上图所示,ZNode 以树结构形式组织。每个都可以存储多达1MB的数据。因此,如果要检索存储在 ZNode 中的数据,则需要知道该 ZNode 的路径。(就像您应该知道数据库的表和列以检索数据一样)。ZNode
如果要在给定路径中检索数据,
client.getData().forPath("/path/to/ZNode");
这就是你想与策展人合作时所要知道的。
还有一件事
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。Autherization 细节设置如下(请参阅客户端构建示例)。还有其他可用的 ACL 模式,例如,如果将其设置为 ACLProvider,则不执行任何访问控制。OPEN_ACL_UNSAFE
authorization("digest", authorizationString.getBytes())
它们稍后将用于控制对给定ZNode的访问。
简而言之,如果您想防止其他人干扰您的ZNodes,则可以将ACLProvider设置为返回并将授权设置为如上所示。只有使用相同授权字符串 () 的 CuratorFramework 实例才能访问这些 ZNode。但它不会阻止其他人在不干扰您的路径中创建ZNode。CREATOR_ALL_ACL
digest
"username:password"
希望你找到你想要的:-)
这不是原始问题的一部分,但我想我会分享一个我提出的解决方案,其中使用的凭据决定了访问级别。
我没有太多的运气找到任何例子,并继续在这个页面上结束,所以也许它会帮助别人。我挖掘了Curator Framework的源代码,幸运的是org.apache.curator.framework.recipes.leader.TestLeaderAcls类为我指出了正确的方向。
所以在这个例子中:
完全控制管理客户端
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.ACLProvider;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;
public class AdminClient {
protected static CuratorFramework client = null;
public void initializeClient() throws NoSuchAlgorithmException {
String zkConnectString = "127.0.0.1:2181";
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
final List<ACL> acls = new ArrayList<>();
//full-control ACL
String zkUsername = "adminuser";
String zkPassword = "adminpass";
String fullControlAuth = zkUsername + ":" + zkPassword;
String fullControlDigest = DigestAuthenticationProvider.generateDigest(fullControlAuth);
ACL fullControlAcl = new ACL(ZooDefs.Perms.ALL, new Id("digest", fullControlDigest));
acls.add(fullControlAcl);
//read-only ACL
String zkReadOnlyUsername = "readuser";
String zkReadOnlyPassword = "readpass";
String readOnlyAuth = zkReadOnlyUsername + ":" + zkReadOnlyPassword;
String readOnlyDigest = DigestAuthenticationProvider.generateDigest(readOnlyAuth);
ACL readOnlyAcl = new ACL(ZooDefs.Perms.READ, new Id("digest", readOnlyDigest));
acls.add(readOnlyAcl);
//create the client with full-control access
client = CuratorFrameworkFactory.builder()
.connectString(zkConnectString)
.retryPolicy(retryPolicy)
.authorization("digest", fullControlAuth.getBytes())
.aclProvider(new ACLProvider() {
@Override
public List<ACL> getDefaultAcl() {
return acls;
}
@Override
public List<ACL> getAclForPath(String string) {
return acls;
}
})
.build();
client.start();
//Now create, read, delete ZK nodes
}
}
只读客户端
import java.security.NoSuchAlgorithmException;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class ReadOnlyClient {
protected static CuratorFramework client = null;
public void initializeClient() throws NoSuchAlgorithmException {
String zkConnectString = "127.0.0.1:2181";
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
String zkReadOnlyUsername = "readuser";
String zkReadOnlyPassword = "readpass";
String readOnlyAuth = zkReadOnlyUsername + ":" + zkReadOnlyPassword;
client = CuratorFrameworkFactory.builder()
.connectString(zkConnectString)
.retryPolicy(retryPolicy)
.authorization("digest", readOnlyAuth.getBytes())
.build();
client.start();
//Now read ZK nodes
}
}