使用来自单个java应用程序的sasl的zookeeper中的多个用户身份验证

时间:2015-07-26 17:54:28

标签: java apache-zookeeper apache-curator

我有zookeeper配置,允许客户端通过sasl进行身份验证(使用摘要md5)。 Zookeeper配置为使用sasl,sasl auth提供程序存在于zookeeper配置中。我有jaas配置列表中的所有用户。每个客户端都拥有自己的jaas配置文件,其中包含用户和密码。在这个配置中一切正常 - 客户端可以使用zookeeper。

但事情就是这样。我有一些客户端无法直接连接到zookeeper - 它连接并验证到单独的模块。该模块(用Java编写)理解传入的请求,并使用Curator Framework客户端与zookeeper进行通信,然后在需要时返回结果。

Java模块拥有自己的jaas配置进行身份验证(用户/密码),所以基本上它可以作为一个用户在zookeeper内部进行身份验证 - 即使有很多用户(具有单独的用户/密码)进行身份验证这个模块。

我如何实现java模块可以在zookeeper中验证多少用户(如果user1调用java模块,它应该在zookeeper中验证为user1,如果user2调用java模块,它应该验证user2等)。

这是我尝试过的方法之一(我知道这种方法不是最好的方法,但我不是动物园管理员的专家,所以我还没有更好的想法) :

  • Java模块有许多jaas配置(每个用户一个)。
  • 当请求到达且用户在java模块中验证自身时 - 模块选择jaas config(通过设置系统属性java.security.auth.login.config指向jaas配置之一)
  • 模块创建新的Curator Framework客户端(它将缓存来自同一用户的后续请求)
  • 模块使用新客户端对zookeeper执行操作

令我惊讶的是,sasl身份验证仅执行一次 - 对于第一位策展人客户端。所有其他客户"分享"相同的身份验证。

有没有办法让每个客户端对zookeeper使用单独的身份验证?

1 个答案:

答案 0 :(得分:1)

不确定我是否正确理解了问题,但它可能与apache ZK客户端在内部创建Login对象作为单例这一事实有关,这意味着同一JVM中的每个客户端都将获得第一个/相同的auth登录凭据