2016-04-25 10 views
0

更新:以下の問題のコンテキスト。私の目標は、各リクエストでカフカのトピックを提供するユーザーのリクエストを処理することです。私は、KafkaプロバイダとしてBluemixに配備されたMessage Hubを使用します。リクエストには、ブローカーのURL、トピック名、ユーザー名、パスワード、およびAPIキーが渡されます。 BluemixのMessage HubはJAAS認証を必要とし、ログインモジュールに異なるLoginModule実装を提供します。 CallbackHandlersに基づくものもあれば、CredentialProvidersのものもあります。WebSphere Libertyでのjaasカスタム・ログイン・モジュールのクラス・ロード

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アプリケーションは、資格情報を渡すためにCredentialProviderをCustomCredentialProviderで拡張しています。

私が理解できないことは、クラスの読み込みがどのように動作するはずかということです。私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> 

ログイン文脈

私は私の streaming-serviceウェブアプリに実装 myApp.CustomCredentialProviderを見つけるために、サードパーティJAASログイン・モジュールのための私の設定を変更しなければならないのはどのよう

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

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

上記構成の結果は、私のCustomCredentialProviderのためにClassNotFoundExceptionです?


注:私はすでにストリーミングservice.jarを生成し、messageHubLoginLibに直接追加しようとしました。これはClassNotFoundExceptionを解決しますが、CustomCredentialProviderクラスは実行中のWebアプリケーションのコンテキストの外部に完全にロードされていますが、依然として私の資格情報にアクセスできません。

答えて

0

streaming-service.jarを生成し、それをメッセージに直接追加します.HubLoginLibは正しい方法です。この場合、JAASログインモジュールとWeb Appの間で共有可能なjarファイルがあります。

しかし、「CustomCredentialProviderクラスが実行中のWebアプリケーションのコンテキスト外に完全にロードされていて、依然として自分の資格情報にアクセスできない」と言いました。ログインモジュールとWebアプリケーションの間で使用するために、CredentialをCustomCredentialProviderクラスに格納しようとしているようです。

CustomCredentialProviderクラスは、ログインモジュールとWebアプリケーションの間で独立している必要があります。リクエストが入ってWebアプリケーションにアクセスしようとすると、サーバーは認証のためにログインモジュールを起動します。合格した場合、Webアプリケーションへのアクセスは正常に終了します。

投稿が表示されません。次の設定が欠落している可能性がありますか?

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

私の場合は満足していません。私は単にサードパーティのカフカサービスで認証しようとしています。このサービスのLoginModuleは、messagehub.login-1.0.0.jarで利用できます。そのサービスの資格情報は、私のCustomCredentialProviderから取得する必要があります。そのクラスは私のストリーミングサービスWebアプリケーションに実装され、実行時にのみカフカの資格情報を取得します。私は今JAASを使って自分のWebアプリを認証する必要はありません。 –

0

あなたは$ {server.config.dir}/libに/グローバルディレクトリにMultiUserLoginModuleとCustomCredentialProvider jarファイルを配置し、以下のように自分のserver.xmlファイル内のグローバルディレクトリにlibraryRefポイントを変更することができます。

<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. すべてのクラスをメッセージHubLoginLibに入れます(別のstreaming-service.jarなど)
  3. これらのクラスをアプリから削除します。
  4. 設定commonLibraryRef属性を使用してログインモジュールのライブラリを参照するクラスローダーの子要素を持つアプリ:あなたはCustomCredentialProviderクラスは、ログインモジュールの間で独立していなければならない」と述べた

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

関連する問題