定制服务器端 Java 认证和授权服务认证及登录配置
WebSphere® Application Server 支持将定制 Java™ 认证和授权服务 (JAAS) 登录模块插入到 WebSphere Application Server 系统登录模块之前或之后。然而,WebSphere Application Server 不支持替换 WebSphere Application Server 系统登录模块,这些模块用于创建主体集中的 WSCredential 凭证和 WSPrincipal 主体。通过使用定制登录模块,您可以作出其他认证决策,也可以将信息添加至主体集中以便在 Java Platform, Enterprise Edition (Java EE) 应用程序中作出其他潜在的细颗粒度授权决策。
关于此任务
WebSphere Application Server 使您能传播由定制登录模块添加到主体集的信息下游。有关更多信息,请参阅安全性属性传播。要确定插入定制登录模块时要使用的登录配置,请参阅Java 认证和授权服务的系统登录配置条目设置中的登录配置描述。
WebSphere Application Server 支持通过管理控制台和使用 wsadmin 脚本编制实用程序修改系统登录配置。要使用管理控制台来配置系统登录配置,请单击安全性 > 全局安全性。在“Java 认证和授权服务”下面,单击系统登录。
过程
- 配置系统登录配置。
请参阅以下使用 wsadmin 工具配置系统登录配置的代码样本。以下样本 Jacl 脚本将定制登录模块添加到轻量级第三方认证 (LTPA) Web 系统登录配置中。
注意: 在以下代码样本中,第 32、33 和 34 行分成两行。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 初始化登录方法中的回调数组。
WebSphere Application Server 版本的 ltpaLoginModule 和 AuthenLoginModule 登录模块使用共享状态来保存状态信息,因此定制登录模块可以修改该信息。ltpaLoginModule 登录模块使用以下代码来初始化登录方法中的回调数组。仅当在共享状态区域中未定义数组时,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. }
- 让 AuthenLoginModule 初始化回调数组。
ltpaLoginModule 和 AuthenLoginModule 登录模块都生成 WSPrincipal 对象和 WSCredential 对象来表示已认证的用户标识和安全凭证。WSPrincipal 和 WSCredential 对象也保存在共享声明中。JAAS 登录使用两阶段落实协议。
首先,调用登录模块中在登录配置中配置的登录方法。然后,调用他们的落实方法。在 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. }
- 获取应用程序上下文。 另外又将三个对象从 Web 容器传递到 AuthenLoginModule
登录模块中,这些对象包含登录的回调信息:java.util.Map、HttpServletRequest
和 HttpServletResponse 对象。这些对象代表 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) 模块配置成使用调用者标识时,会将用户标识传播到 EJB 请求中的下游服务。不会将调用者主体集中的 WSCredential 凭证和任何第三方凭证向下游传播。一些信息可改为在目标服务器中根据已传播的标识重新生成。将第三方凭证在认证阶段添加到调用者主体集。从 WSSubject.getCallerSubject 方法返回的调用者主体集是只读的,因而不能修改。要了解有关 WSSubject 主体集的更多信息,请参阅从线程获取 JAAS 的调用者主体集。
子主题
从线程获取 JAAS 的调用者主体集
调用者主体集(或“已接收的主体集”)包含该请求的调用中使用的用户认证信息。在发出 WSSubject.getCallerSubject 应用程序编程接口 (API) 后返回此主体集,以防止替换现有对象。此主体集被标记为只读。可以使用此 API 来获取对 WSCredential 凭证的访问,以便您可以在凭证内的散列映射中放入或设置数据。从线程获取 JAAS 的 RunAs 主体集
RunAs 主体集或调用主体集包含此方法的应用程序部署描述符中的 RunAs 方式集的用户认证信息。覆盖线程上 JAAS 的 RunAs 主体集
要扩展 Java 认证和授权服务 (JAAS) 应用程序编程接口 (API) 提供的功能,您可以使用用于此运行线程上的出站请求的另一个有效条目设置 RunAs 主体集或调用主体集。从高速缓存中撤销 JAAS 的用户
在 WebSphere Application Server V5.0.2 及更高版本中,支持使用 MBean 接口从安全性高速缓存撤销用户。


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_custsvrsidejaas
文件名:tsec_custsvrsidejaas.html