WebSphere Application
Server permite conectar un módulo de inicio de
sesión JAAS (Java™ Authentication and Authorization
Service) personalizado antes o después del módulo de inicio de sesión
del sistema WebSphere Application Server. No
obstante, WebSphere Application Server no permite sustituir los módulos
de inicio de sesión del sistema WebSphere Application Server que se
utilizan para crear la credencial WSCredential y el principal
WSPrincipal en el Sujeto. Con un módulo de inicio de sesión
personalizado puede tomar decisiones de autenticación adicionales o
añadir información al sujeto para tomar decisiones de autorización
adicionales probablemente más ajustadas dentro de una aplicación
Java
EE (Java Platform,
Enterprise Edition).
Acerca de esta tarea
WebSphere
Application Server permite propagar información en sentido descendente
que se añade al sujeto mediante un módulo de inicio de sesión
personalizado. Para obtener más información, consulte Propagación de atributos de seguridad. Para determinar qué
configuración de inicio de sesión se debe utilizar para conectar los módulos de
inicio de sesión personalizados, consulte las descripciones de las configuraciones
de inicio de sesión que se encuentran en Valores de entrada de configuración de inicio de sesión del sistema de JAAS (Java Authentication and Authorization Service).
WebSphere
Application Server da soporte a la modificación de la configuración de
inicio de sesión del sistema mediante la consola administrativa y
el programa de utilidad de scripts wsadmin. Para configurar la configuración de inicio de sesión
del sistema utilizando la consola administrativa, pulse Seguridad > Seguridad
global. En Java
Authentication and Authorization Service, pulse Inicios de sesión del sistema.
Procedimiento
- Configure una configuración de inicio de sesión de sistema.
Consulte el
siguiente ejemplo de código para configurar una configuración de inicio de sesión
del sistema utilizando la herramienta wsadmin. El siguiente script JACL de ejemplo añade un módulo de inicio de sesión personalizado a la configuración de inicio de sesión LTPA (Lightweight Third-Party Authentication) del sistema web.
Atención: Las líneas 32, 33 y 34 de los ejemplos de código siguientes
se han dividido en dos líneas.
1. #########################################
2. #
3. # Abra security.xml
4. #
5. #########################################
6.
7.
8. set sec [$AdminConfig getid /Cell:hillside/Security:/]
9.
10.
11. #########################################
12. #
13. # Localice 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. # Anexe un nuevo LoginModule a 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. # Guarde el cambio
43. #
44. #########################################
45.
46. $AdminConfig save 47.
Atención: El programa de utilidad de scripts wsadmin
inserta un nuevo objeto al final de la lista.
Para insertar el módulo de inicio de sesión
personalizado antes de AuthenLoginModule, suprima AuthenLoginModule y vuelva a
crearlo después de insertar el módulo de inicio de sesión personalizado. Guarde el
script de ejemplo en un archivo
sample.jacl, y ejecute el
script de ejemplo utilizando el siguiente mandato:
wsadmin -f sample.jacl
- Eliminar la configuración de inicio de sesión de LTPA_WEB actual y todos los
módulos de inicio de sesión.
Puede
utilizar el siguiente script JACL de ejemplo para eliminar la configuración de
inicio de sesión LTPA_WEB actual y todos los módulos de inicio de sesión:
48. #########################################
49. #
50. # Abra security.xml
51. #
52. #########################################
53.
54.
55. set sec [$AdminConfig getid /Cell:hillside/Security:/]
56.
57.
58. #########################################
59. #
60. # Localice 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. # Elimine la configuración de inicio de sesión LTPA_WEB
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. # Guarde el cambio
88. #
89. #########################################
90.
91. $AdminConfig save
- Recupere la configuración de LTPA_WEB original.
Puede utilizar el siguiente script Jacl de ejemplo para
recuperar la configuración LTPA_WEB original:
Atención: Las líneas 122,
124 y 126 de los ejemplos de código siguientes se han dividido en dos o más líneas
con fines ilustrativos solamente.
92. #########################################
93. #
94. # Abra security.xml
95. #
96. #########################################
97.
98.
99. set sec [$AdminConfig getid /Cell:hillside/Security:/]
100.
101.
102. #########################################
103. #
104. # Localice 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. # Vuelva a crear la configuración de inicio de sesión LTPA_WEB
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. # Guarde el cambio
134. #
135. #########################################
136.
137. $AdminConfig save
- Haga que ltpaLoginModule inicialice la matriz de retorno de llamada en el
método de inicio de sesión.
Los módulos de
inicio de sesión ltpaLoginModule y AuthenLoginModule de
WebSphere
Application Server utilizan el estado compartido para guardar
información de estado de modo que los módulos de inicio de sesión
personalizados puedan modificar la información. El módulo de inicio de sesión
ltpaLoginModule inicializa la matriz de devolución de llamada en el método login
utilizando el código siguiente. El módulo de inicio de sesión ltpaLoginModule crea la matriz de retorno de llamada sólo si no hay una matriz definida en el área
de estado compartido. En el
siguiente ejemplo de código, se ha eliminado el código de manejo de errores para que
sea más conciso. Si inserta un módulo de inicio de sesión personalizado antes del módulo de inicio de sesión ltpaLoginModule,
el módulo de inicio de sesión personalizado seguirá el mismo estilo para guardar el retorno de
llamada en el estado compartido.
Atención: En el siguiente ejemplo de código, se han
dividido varias líneas de código en dos líneas para fines ilustrativos.
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. }
- Haga que AuthenLoginModule inicialice la matriz de retorno de llamada.
Los módulos de inicio de sesión ltpaLoginModule y AuthenLoginModule generan un objeto WSPrincipal y un objeto WSCredential para representar la identidad del usuario
autenticado y las credenciales de seguridad. Los objetos WSPrincipal y WSCredential
también se guardan en el estado compartido. Un inicio de sesión JAAS utiliza un
protocolo de compromiso de dos fases.
Primero se llama a los métodos de inicio de
sesión en los módulos de inicio de sesión, que están configurados en la
configuración de inicio de sesión. A continuación, se llama a sus métodos de
compromiso. Un módulo de inicio de sesión personalizado, que se inserte después de los módulos de inicio de sesión ltpaLoginModule
y AuthenLoginModule, puede modificar los objetos WSPrincipal y WSCredential
antes de que se confirmen estos objetos. Los objetos WSCredential y WSPrincipal deben existir en el
sujeto después de realizar el inicio de sesión. Sin estos objetos en el
sujeto, el código de tiempo de ejecución de
WebSphere
Application Server rechaza el sujeto para tomar decisiones de seguridad.
AuthenLoginModule
utiliza el siguiente código para inicializar la matriz de retorno de llamada:
Atención: En el siguiente ejemplo de código, se han
dividido varias líneas de código en dos líneas para fines ilustrativos.
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. }
- Obtenga el contexto de aplicación. Se pasan tres objetos más, que contienen información de retorno de llamada para el inicio de sesión, desde el contenedor web al módulo de inicio de sesión AuthenLoginModule: un objeto java.util.Map, un objeto HttpServletRequest y un objeto HttpServletResponse. Estos objetos
representan el contexto de aplicación web.
Puede obtener el contexto de aplicación, el objeto java.util.Map,
llamando al método getContext en el objeto WSAppContextCallback. El
objeto java.util.Map se crea con la siguiente información del descriptor de
despliegue.
Atención: En el siguiente ejemplo de código, se han
dividido varias líneas de código en dos líneas para fines ilustrativos.
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);
Qué hacer a continuación
El módulo de inicio de sesión personalizado puede leer el nombre de la aplicación y el objeto HttpServletRequest para realizar funciones de
correlación.
Un módulo de inicio de sesión personalizado puede modificar la página de error del
inicio de sesión basado en formularios. Además de la infraestructura
JAAS, WebSphere Application Server da soporte a la interfaz TAI (Trust
Association Interface).
Se pueden añadir otros tipos de credenciales e
información al sujeto emisor durante el proceso de autenticación utilizando un
módulo de inicio de sesión personalizado. WebSphere
Application Server gestiona las credenciales de terceros en el sujeto
emisor como parte del contexto de seguridad. El sujeto emisor se enlaza con la hebra de
ejecución durante el proceso de la petición. Cuando se configura un módulo web o EJB (Enterprise
JavaBeans) para
utilizar la identidad del emisor, la identidad del usuario se propaga en el servicio en sentido descendente
en una solicitud EJB. La credencial WSCredential y las credenciales
de terceros en el sujeto emisor no se propagan en sentido descendente. En lugar de
ello, se puede volver a generar parte de la información en el servidor de destino
que está basada en la identidad propagada. Añada credenciales de terceros al sujeto emisor en la fase de
autenticación. El sujeto emisor, que devuelve el método
WSSubject.getCallerSubject, es de sólo lectura y no se puede modificar. Para obtener más información sobre el sujeto WSSubject, consulte Obtención del sujeto del emisor de la hebra para JAAS.