2016-04-25 204 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>