在策展人中使用ACL

使用CuratorFramework ,有人可以解释我怎么做:

  1. 创建一个新路径
  2. 设置此路径的数据
  3. 走这条路

使用用户名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以树形结构组织。 每个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。

希望你找到你想要的东西:-)