0

更新:关于以下问题的一些上下文。我的目标是处理用户的请求,他们为每个请求提供一个 Kafka 主题。我使用部署在 Bluemix 上的 Message Hub 作为 Kafka 提供者。请求将传递代理 URL、主题名称、用户名、密码和 API 密钥。Bluemix 上的 Message Hub 需要 JAAS 身份验证并提供具有不同 LoginModule 实现的登录模块。有些基于 CallbackHandlers,有些基于 CredentialProviders。

我选择了在com.ibm.messagehub.login.MultiUserLoginModule. 使用该模块,我只需要提供一个自定义凭据提供程序,例如:

KafkaClient {
com.ibm.messagehub.login.MultiUserLoginModule required
credentialProvider="myApp.CustomCredentialProvider";
};

挑战在于类加载器以及 CustomCredentialProvider 如何在运行时从传递给 MultiUserLoginModule 的请求中获取用户名/密码。我必须使用什么配置才能使其正常工作?

详细信息:我有一个在 WebSphere Liberty 8.5.5 中运行的 Web 应用程序,并希望通过第三方服务进行身份验证。该第三方服务使用 CredentialProvider 实现 JAAS LoginModule。我的 Web 应用程序使用 CustomCredentialProvider 扩展 CredentialProvider 以传递凭据。

我不明白类加载应该如何工作。我的server.xml定义:

网络应用程序

 <webApplication id="streaming-service" location="streaming-service.war" name="streaming-service"/>

第三方登录模块

<jaasLoginModule className="com.ibm.messagehub.login.MultiUserLoginModule" controlFlag="REQUIRED" id="KafkaClient" libraryRef="messageHubLoginLib">
<options credentialProvider="myApp.CustomCredentialProvider" serviceName="kafka"/>
</jaasLoginModule>

实现第三方登录模块的库

   <library id="messageHubLoginLib">
    <fileset dir="${server.output.dir}" includes="messagehub.login-1.0.0.jar"/>
</library>

登录上下文

 <jaasLoginContextEntry id="KafkaClient" loginModuleRef="KafkaClient" name="KafkaClient"/>

上述配置的结果是我的 CustomCredentialProvider 的 ClassNotFoundException:

Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: myApp.CustomCredentialProvider
at com.ibm.messagehub.login.MultiUserLoginModule$MultiUserCallbackHandler.<clinit>(MultiUserLoginModule.java:80)

如何更改第三方 JAAS 登录模块的配置才能myApp.CustomCredentialProvider在我的streaming-serviceWeb 应用程序中实现?


注意:我已经尝试生成一个 streaming-service.jar 并将其直接添加到messageHubLoginLib. 这解决了 ClassNotFoundException 但 CustomCredentialProvider 类完全在我正在运行的 Web 应用程序的上下文之外加载,并且仍然无法访问我的凭据。

4

3 回答 3

3

有了单独的 streaming-service.jar,您就快到了。这是所需的所有步骤。

  1. 识别需要对登录模块可见的类(来自您的应用程序)。
  2. 将所有这些类放入您的 messageHubLoginLib(例如在单独的流式服务.jar 中)
  3. 从您的应用程序中删除这些类。
  4. 使用 commonLibraryRef 属性使用引用登录模块库的类加载器子元素配置应用程序:

<webApplication id="streaming-service" location="streaming-service.war" name="streaming-service">
    <classloader commonLibraryRef="messageHubLoginLib" />
</webApplication>

于 2016-04-25T22:49:58.413 回答
0

生成一个 streaming-service.jar 并将其直接添加到 messageHubLoginLib 应该是正确的做法。在这种情况下,您有一个可在 JAAS 登录模块和 Web 应用程序之间共享的 jar 文件。

但是,您说“CustomCredentialProvider 类完全在我正在运行的 Web 应用程序的上下文之外加载,并且仍然无法访问我的凭据”。听起来您试图将凭据存储在 CustomCredentialProvider 类中,以便在登录模块和 Web 应用程序之间使用。

CustomCredentialProvider 类应该独立于登录模块和 Web 应用程序。当请求进来并尝试访问 Web 应用程序时,服务器会触发登录模块进行身份验证。如果通过,则访问 web 应用程序将成功。

没看到你发帖 可能是您缺少以下配置吗?

<jaasLoginContextEntry id="system.WEB_INBOUND" name="system.WEB_INBOUND" loginModuleRef="KafkaClient,hashtable,certificate,token" />
于 2016-04-25T14:28:33.717 回答
0

您可以将 MultiUserLoginModule 和 CustomCredentialProvider jar 文件放在 ${server.config.dir}/lib/global 目录中,并将 libraryRef 指向 server.xml 文件中的全局目录,如下所示:

  <jaasLoginModule className="com.ibm.messagehub.login.MultiUserLoginModule" controlFlag="REQUIRED" id="KafkaClient" libraryRef="global">
    <options credentialProvider="myApp.CustomCredentialProvider" serviceName="kafka"/>
    </jaasLoginModule>
于 2016-04-25T19:10:49.000 回答