在策展人中使用ACL
使用CuratorFramework ,有人可以解释我怎么做:
- 创建一个新路径
- 设置此路径的数据
- 走这条路
使用用户名foo
和密码bar
? 那些不知道这个用户/通行证的人将无法做任何事情。
出于此问题的目的,我不关心通过明文发送的SSL或密码。
Apache Curator中的ACL用于访问控制。 因此,ZooKeeper不提供任何身份validation机制, clients who don't have correct password cannot connect to ZooKeeper or cannot create ZNodes
。 它可以做的是,防止未经授权的客户端访问特定的Znode / ZNode。 为此,您必须设置CuratorFramework实例,如下所述。 请记住,这将保证具有给定ACL的ZNode创建可以由同一客户端或呈现相同身份validation信息的客户端再次访问。
首先,您应该按如下方式构建CuratorFramework
instane。 这里, 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 getDefaultAcl() { return ZooDefs.Ids.CREATOR_ALL_ACL; } @Override public List 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
都应以/
(root)开头,您可以根据需要继续指定目录,如ZNodePaths。 例如: /someName/another/test/sample
。
如上图所示,ZNode以树形结构组织。 每个ZNode
可以存储多达1MB的数据。 因此,如果要检索存储在ZNode中的数据,则需要知道该ZNode的路径。 (就像您应该知道数据库的表和列以便检索数据一样)。
如果要在给定路径中检索数据,
client.getData().forPath("/path/to/ZNode");
当你想与策展人合作时,你必须知道这一切。
还有一件事
Apache Curator中的ACL用于访问控制。 也就是说,如果您按如下方式设置ACLProvider
,
new ACLProvider() { @Override public List getDefaultAcl () { return ZooDefs.Ids.CREATOR_ALL_ACL; } @Override public List getAclForPath (String path){ return ZooDefs.Ids.CREATOR_ALL_ACL; } }
只有具有与创建者相同的凭据的客户端才能在以后获得对相应ZNode的访问权限。 Autherization详细信息设置如下(请参阅客户端构建示例)。 还有其他OPEN_ACL_UNSAFE
的ACL模式,如OPEN_ACL_UNSAFE
,如果将其设置为OPEN_ACL_UNSAFE
,则不执行任何访问控制。
authorization("digest", authorizationString.getBytes())
稍后将使用它们来控制对给定ZNode的访问。
简而言之,如果您想阻止其他人干扰您的ZNode,您可以将ACLProvider设置为返回CREATOR_ALL_ACL
并将授权设置为digest
如上所示。 只有使用相同授权字符串( "username:password"
)的CuratorFramework实例才能访问这些ZNode。 但它不会阻止其他人在不干扰你的路径中创建ZNode。
希望你找到你想要的东西:-)