WebSphere® Application Server は、WebSphere Application Server のシステム・ログイン・モジュールの前または後に、カスタム Java™ Authentication and Authorization Service (JAAS) のログイン・モジュールのプラグインをサポートします。
ただし、WebSphere Application Server は、WebSphere Application Server システム・ログイン・モジュールの置き換えはサポートしません。サブジェクトで WSCredential クレデンシャルおよび WSPrincipal プリンシパルを作成する際に、WebSphere Application Server システム・ログイン・モジュールを使用するためです。
カスタム・ログイン・モジュールを使用して、追加の認証を決定するか、またはサブジェクトに情報を追加して、Java Platform, Enterprise Edition (Java EE) アプリケーション内で、より細かい追加の許可を決定することができます。
このタスクについて
WebSphere Application Server を使用すると、カスタム・ログイン・モジュールによってサブジェクトに追加される情報をダウンストリームに伝搬できます。
詳しくは、セキュリティー属性の伝搬を参照してください。
カスタム・ログイン・モジュールのプラグインに使用するログイン構成の判別については、
Java Authentication and Authorization Service 用のシステム・ログイン構成エントリー設定にある
ログイン構成の説明を参照してください。
WebSphere Application Server では、管理コンソールを介し、wsadmin スクリプト・ユーティリティーを使用して、システム・ログイン構成の変更をサポートします。
管理コンソールを使用して、システム・ログイン構成を構成するには、「セキュリティー」>「グローバル・セキュリティー」とクリックします。「Java 認証・承認サービス」の下の「システム・ログイン」をクリックします。
手順
- システム・ログイン構成を構成します。
wsadmin ツールを使用してシステム・ログイン構成を構成するには、
以下のコード・サンプルを参照してください。
以下のサンプル Jacl スクリプトで、Lightweight Third-party Authentication (LTPA) Web システム・ログイン構成に
カスタム・ログイン・モジュールが追加されます。
重要: 以下のコード・サンプルの 32 行、33 行、および 34 行は、2 行に分割されています。
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 スクリプト・ユーティリティーは、
リストの最後に新規オブジェクトを挿入します。AuthenLoginModule ログイン・モジュールの前に
カスタム・ログイン・モジュールを挿入するには、AuthenLoginModule ログイン・モジュールを削除し、
カスタム・ログイン・モジュールを挿入後に再作成します。
ファイル
sample.jacl にサンプル・スクリプトを保存し、
次のコマンドを使用してそのサンプル・スクリプトを実行します。
wsadmin -f sample.jacl
- 現行の LTPA_WEB ログイン構成とすべてのログイン・モジュールを除去します。
次のサンプル Jacl スクリプトを使用すると、
現行の LTPA_WEB ログイン構成とすべてのログイン・モジュールを除去することができます。
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
- オリジナルの LTPA_WEB 構成をリカバリーします。
次のサンプル Jacl スクリプトを使用すると、
オリジナルの LTPA_WEB 構成をリカバリーすることができます。
重要: 以下のコード・サンプルの 122、124、および 126 行は、
表示上の理由で複数の行に分割されています。
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
- ltpaLoginModule により、login メソッドでコールバック配列を初期化します。
WebSphere Application Server バージョン ltpaLoginModule ログイン・モジュールおよび AuthenLoginModule ログイン・モジュールは、共用の状態を使用して状態情報を保管するため、カスタム・ログイン・モジュールでその情報を変更することができます。
ltpaLoginModule ログイン・モジュールは次のコードを使用して、login メソッドでコールバック配列を初期化します。コールバック配列は、
配列が共有状態の領域で定義されない場合のみ、ltpaLoginModule ログイン・モジュールによって作成されます。
次のコード・サンプルでは、
サンプルを簡潔にするためにエラー処理コードが除去されています。
ltpaLoginModule ログイン・モジュールの前にカスタム・ログイン・モジュールを挿入する場合、
カスタム・ログイン・モジュールは、同じスタイルに従って、共有の状態にコールバックを保存する場合があります。
重要: 以下のコード・サンプルでは、コードのいくつかの行が表示上の理由で 2 行に分割されています。
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. }
- AuthenLoginModule により、コールバック配列を初期化します。
ltpaLoginModule ログイン・モジュールおよび AuthenLoginModule ログイン・モジュールは、
WSPrincipal オブジェクトと WSCredential オブジェクトの両方を生成し、
認証済みユーザー ID とセキュリティー・クレデンシャルを
表します。WSPrincipal オブジェクトおよび WSCredential オブジェクトも、
共有の状態に保存されます。JAAS ログインは、2 フェーズ・コミット・プロトコルを使用します。
最初に、ログイン構成で構成された、ログイン・モジュールのログイン・メソッドが呼び出されます。
次に、それらのコミット・メソッドが呼び出されます。ltpaLoginModule ログイン・モジュール
および AuthenLoginModule ログイン・モジュールの後に挿入されたカスタム・ログイン・モジュールは、
WSPrincipal オブジェクトおよび WSCredential オブジェクトがコミットされる前に、これらを変更することができます。
WSCredential オブジェクトおよび WSPrincipal オブジェクトは、ログインが完了後、サブジェクトに存在しなければなりません。
サブジェクト内にこれらのオブジェクトがない場合、WebSphere Application Server ランタイム・コードは、セキュリティー決定を行うサブジェクトをリジェクトします。
AuthenLoginModule は次のコードを使用して、コールバック配列を初期化します。
重要: 以下のコード・サンプルでは、コードのいくつかの行が表示上の理由で 2 行に分割されています。
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 アプリケーション・コンテキストを表します。
WSAppContextCallback オブジェクト上で
getContext() メソッドを呼び出して、アプリケーション・コンテキスト java.util.Map オブジェクトを取得することができます。
java.util.Map オブジェクトは、
次のデプロイメント記述子情報を使用して作成されます。
重要: 以下のコード・サンプルでは、コードのいくつかの行が表示上の理由で 2 行に分割されています。
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 サブジェクトについて詳しくは、
JAAS のスレッドからの呼び出し元サブジェクトの取得を参照してください。