2016-04-25 91 views
0

UPDATE:下面的问题的一些背景。我的目标是为每个请求提供卡夫卡主题的用户处理请求。我使用部署在Bluemix上的Message Hub作为Kafka提供程序。这些请求将传递代理URL,主题名称,用户名,密码和API密钥。 Bluemix上的消息中心需要JAAS身份验证,并提供具有不同LoginModule实现的登录模块。有些基于CallbackHandlers,其他基于CredentialProviders。类加载的JAAS自定义登录模块在WebSphere自由

我挑中com.ibm.messagehub.login.MultiUserLoginModule实施的一个。有了这个模块,我应该只需要提供自定义凭据提供这样的:

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

的挑战是在类加载器和如何CustomCredentialProvider可以从传递到MultiUserLoginModule在运行时请求的用户名/密码。我必须使用什么配置才能使其工作?

细节:我在WebSphere 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.CustomCredentialProviderstreaming-service web应用程序中实现?


注:我已经尝试过,产生以流式service.jar中,并直接将它添加到messageHubLoginLib。这解决了ClassNotFoundException,但CustomCredentialProvider类完全在我运行的Web应用程序的上下文之外加载,并且仍然不允许我访问我的凭据。

回答

0

生成以流式service.jar中,并直接将它添加到messageHubLoginLib应该做的正确方法。在这种情况下,您可以在JAAS登录模块和Web App之间共享一个jar文件。

但是,你说:“CustomCredentialProvider类是我跑步的web应用程序上下文之外完全加载,仍然没有给我访问我的凭据”。这听起来就像您试图将凭据存储在CustomCredentialProvider类中以供在登录模块和Web应用程序之间使用一样。

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

我没看到你发布。可能是你缺少以下配置?

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

你说“的CustomCredentialProvider类应该是登录模块之间独立和网络应用程序“,但这并不满足我的情况。我只是试图与第三方Kafka服务进行身份验证。该服务的LoginModule可用于messagehub.login-1.0.0.jar。该服务的凭据应来自我的CustomCredentialProvider。该类在我的流式服务Web应用程序中实现,并且只在运行时获取Kafka凭据。我现在不需要使用JAAS来认证我自己的网络应用程序。 –

0

您可以将MultiUserLoginModule和CustomCredentialProvider jar文件在$ {} server.config.dir/lib目录/全球目录并更改libraryRef点全局目录中的server.xml文件如下:

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

你差不多在那里使用单独的streaming-service.jar。以下是所有需要的步骤。

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

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