ApacheKafka—在WebSphereLiberty中为jaas自定义登录模块加载类

6za6bjd0  于 2021-06-07  发布在  Kafka
关注(0)|答案(3)|浏览(320)

更新:下面是关于这个问题的一些背景知识。我的目标是处理用户的请求,用户在每个请求中提供一个Kafka主题。我使用部署在bluemix上的消息中心作为kafka提供者。请求将传递代理url、主题名、用户名、密码和api密钥。bluemix上的消息中心需要jaas身份验证,并提供具有不同loginmodule实现的登录模块。一些基于回调处理程序,另一些基于凭据提供程序。
我选了一个 com.ibm.messagehub.login.MultiUserLoginModule . 使用该模块,我只需提供自定义凭据提供程序,如:

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

挑战在于类加载器以及customcredentialprovider如何在运行时从传递给multiuserloginmodule的请求中获取用户名/密码。我必须使用什么配置才能工作?
详细信息:我有一个运行在WebSphereLiberty 8.5.5中的web应用程序,希望通过第三方服务进行身份验证。该第三方服务使用credentialprovider实现jaas loginmodule。我的web应用使用customcredentialprovider扩展credentialprovider以传递凭据。
我不明白的是类加载应该如何工作。我的 server.xml 定义:
web应用程序

<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 网络应用?
注意:我已经尝试生成streaming-service.jar并将其直接添加到 messageHubLoginLib . 这解决了classnotfoundexception,但是customcredentialprovider类完全在我运行的web应用程序的上下文之外加载,仍然不允许我访问我的凭据。

hl0ma9xz

hl0ma9xz1#

你就差一点看到了单独的streaming-service.jar。以下是所需的所有步骤。
确定登录模块需要可见的类(来自应用程序)。
将所有这些类放到messagehubloginlib中(例如,在一个单独的streaming service.jar中)
从应用程序中删除这些类。
使用类加载器子元素配置应用程序,该子元素使用commonlibraryref属性引用登录模块库:

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

bn31dyow2#

生成streaming-service.jar并将其直接添加到messagehubloginlib应该是正确的方法。在本例中,您有一个jar文件,可以在jaas登录模块和web应用程序之间共享。
但是,您说过“customcredentialprovider类完全在我运行的web应用程序的上下文之外加载,仍然不允许我访问我的凭据”。听起来像是您试图将凭据存储在customcredentialprovider类中,以便在登录模块和web应用之间使用。
customcredentialprovider类应该独立于登录模块和web应用程序。当请求进入并尝试访问web应用时,服务器触发登录模块进行身份验证。如果通过,将成功访问web应用程序。
我没看到你被贴出来。可能您缺少以下配置?

<jaasLoginContextEntry id="system.WEB_INBOUND" name="system.WEB_INBOUND" loginModuleRef="KafkaClient,hashtable,certificate,token" />
wgxvkvu9

wgxvkvu93#

能否将multiuserloginmodule和customcredentialprovider jar文件放在${server.config.dir}/lib/global目录中,并将libraryref点更改为server.xml文件中的global目录,如下所示:

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

相关问题