WebSphere Application Server は、 WebSphere Application Server のシステム・ログイン・モジュールの前または後に、 カスタム Java Authentication and Authorization Service (JAAS) のログイン・モジュールのプラグインをサポートします。 ただし、WebSphere Application Server は、 WebSphere Application Server システム・ログイン・モジュールを置き換えることはしません。 サブジェクトで WSCredential クレデンシャルおよび WSPrincipal プリンシパルを作成する際に、 WebSphere Application Server システム・ログイン・モジュールを使用する ためです。 カスタム・ログイン・モジュールを使用して、追加の認証決定を行うか、または サブジェクトに情報を追加して、Java 2 Platform, Enterprise Edition (J2EE) アプリケーション内で、 細分化可能な追加の許可決定を行うことができます。
WebSphere Application Server を使用すると、 カスタム・ログイン・モジュールによって subject に追加される情報をダウンストリームへ伝搬できます。 詳しくは、セキュリティー属性の伝搬 を参照してください。 カスタム・ログイン・モジュールのプラグインに使用するログイン構成の判別については、 Java Authentication and Authorization Service 用のシステム・ログイン構成エントリー設定 にある ログイン構成の説明を参照してください。
WebSphere Application Server では、 管理コンソールを介し、wsadmin スクリプト・ユーティリティーを使用して、 システム・ログイン構成の変更をサポートします。 管理コンソールを使ってシステム・ログインを構成するには、 「セキュリティー」>「管理、アプリケーション、およびインフラストラクチャーの保護」をクリックします。「Java Authentication and Authorization Service」の下の「システム・ログイン」をクリックします。
wsadmin ツールを使用してシステム・ログイン構成を構成するには、 以下のコード・サンプルを参照してください。 以下のサンプル Jacl スクリプトで、 Lightweight Third-party Authentication (LTPA) Web システム・ログイン構成に カスタム・ログイン・モジュールが追加されます。
1. ######################################### 2. # 3. # Open security.xml 4. # 5. ######################################### 6. 7. 8. set sec [$AdminConfig getid /Cell:hillside/Security:/] 9. 10. 11. ######################################### 12. # 13. # Locate systemLoginConfig 14. # 15. ######################################### 16. 17. 18. set slc [$AdminConfig showAttribute $sec systemLoginConfig] 19. 20. set entries [lindex [$AdminConfig showAttribute $slc entries] 0] 21. 22. 23. ######################################### 24. # 25. # Append a new LoginModule to LTPA_WEB 26. # 27. ######################################### 28. 29. foreach entry $entries { 30. set alias [$AdminConfig showAttribute $entry alias] 31. if {$alias == "LTPA_WEB"} { 32. set newJAASLoginModuleId [$AdminConfig create JAASLoginModule $entry {{moduleClassName "com.ibm.ws.security.common.auth.module.proxy.WSLoginModuleProxy"}}] 33. set newPropertyId [$AdminConfig create Property $newJAASLoginModuleId {{name delegate}{value "com.ABC.security.auth.CustomLoginModule"}}] 34. $AdminConfig modify $newJAASLoginModuleId {{authenticationStrategy REQUIRED}} 35. break 36. } 37. } 38. 39. 40. ######################################### 41. # 42. # save the change 43. # 44. ######################################### 45. 46. $AdminConfig save 47.
wsadmin -f sample.jacl
48. ######################################### 49. # 50. # Open security.xml 51. # 52. ######################################### 53. 54. 55. set sec [$AdminConfig getid /Cell:hillside/Security:/] 56. 57. 58. ######################################### 59. # 60. # Locate systemLoginConfig 61. # 62. ######################################### 63. 64. 65. set slc [$AdminConfig showAttribute $sec systemLoginConfig] 66. 67. set entries [lindex [$AdminConfig showAttribute $slc entries] 0] 68. 69. 70. ######################################### 71. # 72. # Remove the LTPA_WEB login configuration 73. # 74. ######################################### 75. 76. foreach entry $entries { 77. set alias [$AdminConfig showAttribute $entry alias] 78. if {$alias == "LTPA_WEB"} { 79. $AdminConfig remove $entry 80. break 81. } 82. } 83. 84. 85. ######################################### 86. # 87. # save the change 88. # 89. ######################################### 90. 91. $AdminConfig save
92. ######################################### 93. # 94. # Open security.xml 95. # 96. ######################################### 97. 98. 99. set sec [$AdminConfig getid /Cell:hillside/Security:/] 100. 101. 102. ######################################### 103. # 104. # Locate systemLoginConfig 105. # 106. ######################################### 107. 108. 109. set slc [$AdminConfig showAttribute $sec systemLoginConfig] 110. 111. set entries [lindex [$AdminConfig showAttribute $slc entries] 0] 112. 113. 114. 115. ######################################### 116. # 117. # Recreate the LTPA_WEB login configuration 118. # 119. ######################################### 120. 121. 122. set newJAASConfigurationEntryId [$AdminConfig create JAASConfigurationEntry $slc {{alias LTPA_WEB}}] 123. 124. set newJAASLoginModuleId [$AdminConfig create JAASLoginModule $newJAASConfigurationEntryId {{moduleClassName "com.ibm.ws.security.common.auth.module.proxy.WSLoginModuleProxy"}}] 125. 126. set newPropertyId [$AdminConfig create Property $newJAASLoginModuleId {{name delegate}{value "com.ibm.ws.security.web.AuthenLoginModule"}}] 127. 128. $AdminConfig modify $newJAASLoginModuleId {{authenticationStrategy REQUIRED}} 129. 130. 131. ######################################### 132. # 133. # save the change 134. # 135. ######################################### 136. 137. $AdminConfig save
WebSphere Application Server バージョン ltpaLoginModule ログイン・モジュール および AuthenLoginModule ログイン・モジュールは、共用の状態を使用して状態情報を保管するため、 カスタム・ログイン・モジュールでその情報を変更することができます。ltpaLoginModule ログイン・モジュールは次のコードを使用して、 login メソッドでコールバック配列を初期化します。コールバック配列は、 配列が共用状態の領域で定義されない場合のみ、ltpaLoginModule ログイン・モジュールによって作成されます。 次のコード・サンプルでは、 サンプルを簡潔にするためにエラー処理コードが除去されています。 ltpaLoginModule ログイン・モジュールの前にカスタム・ログイン・モジュールを挿入する場合、 カスタム・ログイン・モジュールは、同じスタイルに従って、共用の状態にコールバックを保管する場合があります。
138. Callback callbacks[] = null; 139. if (!sharedState.containsKey( com.ibm.wsspi.security.auth.callback.Constants.CALLBACK_KEY)) { 140. callbacks = new Callback[3]; 141. callbacks[0] = new NameCallback("Username: "); 142. callbacks[1] = new PasswordCallback("Password: ", false); 143. callbacks[2] = new com.ibm.websphere.security.auth.callback. WSCredTokenCallbackImpl ("Credential Token: "); 144. try { 145. callbackHandler.handle(callbacks); 146. } catch (java.io.IOException e) { 147. . . . 148. } catch (UnsupportedCallbackException uce) { 149. . . . 150. } 151. sharedState.put( com.ibm.wsspi.security.auth.callback.Constants.CALLBACK_KEY, callbacks); 152. } else { 153. callbacks = (Callback []) sharedState.get( com.ibm.wsspi.security.auth.callback.Constants.CALLBACK_KEY); 154. }
ltpaLoginModule ログイン・モジュールおよび AuthenLoginModule ログイン・モジュールは、 WSPrincipal オブジェクトと WSCredential オブジェクトの両方を生成し、 認証済みユーザー ID とセキュリティー・クレデンシャルを 表します。WSPrincipal オブジェクトおよび WSCredential オブジェクトも、 共用の状態に保管されます。JAAS ログインは、2 フェーズ・コミット・プロトコルを使用します。
最初に、ログイン構成で構成された、ログイン・モジュールのログイン・メソッドが呼び出されます。 次に、それらのコミット・メソッドが呼び出されます。ltpaLoginModule ログイン・モジュール および AuthenLoginModule ログイン・モジュールの後に挿入されたカスタム・ログイン・モジュールは、 WSPrincipal オブジェクトおよび WSCredential オブジェクトがコミットされる前に、これらを変更することができます。 WSCredential オブジェクトおよび WSPrincipal オブジェクトは、ログインが完了後、サブジェクトに存在しなければなりません。 サブジェクト内にこれらのオブジェクトがない場合、WebSphere Application Server ランタイム・コードは、 セキュリティー決定を行うサブジェクトをリジェクトします。
AuthenLoginModule は次のコードを使用して、コールバック配列を初期化します。
155. Callback callbacks[] = null; 156. if (!sharedState.containsKey( com.ibm.wsspi.security.auth.callback.Constants.CALLBACK_KEY)) { 157. callbacks = new Callback[6]; 158. callbacks[0] = new NameCallback("Username: "); 159. callbacks[1] = new PasswordCallback("Password: ", false); 160. callbacks[2] = new com.ibm.websphere.security.auth.callback.WSCredTokenCallbackImpl( "Credential Token: "); 161. callbacks[3] = new com.ibm.wsspi.security.auth.callback.WSServletRequestCallback( "HttpServletRequest: "); 162. callbacks[4] = new com.ibm.wsspi.security.auth.callback.WSServletResponseCallback( "HttpServletResponse: "); 163. callbacks[5] = new com.ibm.wsspi.security.auth.callback.WSAppContextCallback( "ApplicationContextCallback: "); 164. try { 165. callbackHandler.handle(callbacks); 166. } catch (java.io.IOException e) { 167. . . . 168. } catch (UnsupportedCallbackException uce { 169. . . . 170. } 171. sharedState.put( com.ibm.wsspi.security.auth.callback.Constants.CALLBACK_KEY, callbacks); 172. } else { 173. callbacks = (Callback []) sharedState.get( com.ibm.wsspi.security.auth.callback.Constants.CALLBACK_KEY); 174. }
ログイン用のコールバック情報が含まれる他の 3 つのオブジェクト (java.util.Map、HttpServletRequest、および HttpServletResponse オブジェクト) が、 Web コンテナーから AuthenLoginModule ログイン・モジュールに渡されます。 これらのオブジェクトは、Web アプリケーション・コンテキストを表します。WebSphere Application Server バージョン 5.1 の アプリケーション・コンテキストである java.util.Map オブジェクトには、 アプリケーション名と、エラー・ページの Web アドレスが含まれます。WSAppContextCallback オブジェクト上で getContext() メソッドを呼び出して、アプリケーション・コンテキスト java.util.Map オブジェクトを取得することができます。 java.util.Map オブジェクトは、 次のデプロイメント記述子情報を使用して作成されます。
175. HashMap appContext = new HashMap(2); 176. appContext.put( com.ibm.wsspi.security.auth.callback.Constants.WEB_APP_NAME, web_application_name); 177. appContext.put( com.ibm.wsspi.security.auth.callback.Constants.REDIRECT_URL, errorPage);
アプリケーション名および HttpServletRequest オブジェクトは、 カスタム・ログイン・モジュールがマッピング機能を実行する際に読み取られることがあります。フォーム・ベースの ログインのエラー・ページは、カスタム・ログイン・モジュールによって変更される可能性があります。 JAAS フレームワークのほかに、WebSphere Application Server は、 トラスト・アソシエーション・インターフェース (TAI) をサポートします。
他のクレデンシャル・タイプおよび情報は、 カスタム・ログイン・モジュールを使用した認証プロセス中に、呼び出し側サブジェクトに追加することができます。呼び出し側サブジェクトの サード・パーティー・クレデンシャルは、WebSphere Application Server によって、セキュリティー・コンテキストの一部として管理されます。 呼び出し側サブジェクトは、要求の処理中に、実行スレッドにバインドされます。 Web または Enterprise JavaBeans (EJB) モジュールが、呼び出し側の ID を使用するように構成されている場合、 ユーザー ID は EJB 要求のダウンストリーム・サービスに伝搬されます。WSCredential クレデンシャル および呼び出し側サブジェクト内の任意のサード・パーティー・クレデンシャルは、ダウンストリームに伝搬されません。 その代わり、一部の情報は、伝搬された ID に基づいてターゲット・サーバーで再生成することができます。 認証段階で、サード・パーティー・クレデンシャルを呼び出し側サブジェクトに追加します。 WSSubject.getCallerSubject メソッドから戻される呼び出し側サブジェクトは、 読み取り専用であるため、変更することはできません。 WSSubject サブジェクトについて詳しくは、 例: スレッドからの呼び出し元サブジェクトの取得 を参照してください。