更新:关于以下问题的一些上下文。我的目标是处理用户的请求,他们为每个请求提供一个 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-service
Web 应用程序中实现?
注意:我已经尝试生成一个 streaming-service.jar 并将其直接添加到messageHubLoginLib
. 这解决了 ClassNotFoundException 但 CustomCredentialProvider 类完全在我正在运行的 Web 应用程序的上下文之外加载,并且仍然无法访问我的凭据。