Desarrollo de módulos de inicio de sesión personalizados para una configuración de inicio de sesión del sistema para JAAS
En WebSphere Application Server hay varios puntos de plug-in JAAS (Java™ Authentication and Authorization Service) para configurar los inicios de sesión del sistema. WebSphere Application Server utiliza configuraciones de inicio de sesión del sistema para autenticar las solicitudes entrantes, las solicitudes salientes y los inicios de sesión del servidor interno.
Acerca de esta tarea
- WEB_INBOUND
- RMI_OUTBOUND
- RMI_INBOUND
- DEFAULT
Procedimiento
- Autentique las solicitudes web con la configuración de inicio de sesión WEB_INBOUND.
La configuración de inicio de sesión WEB_INBOUND autentica las solicitudes web.
Para obtener información más detallada en la configuración WEB_INBOUND, incluidas sus retornos de llamada asociados, consulte "RMI_INBOUND, WEB_INBOUND, DEFAULT" en Valores de entrada de configuración de inicio de sesión del sistema de JAAS (Java Authentication and Authorization Service).
La Figura 1 muestra un ejemplo de configuración que utiliza un TAI (interceptor de asociación de confianza) que crea un asunto con la información inicial que se ha pasado a la configuración de inicio de sesión WEB_INBOUND. Si el interceptor de asociación de confianza no está configurado, el proceso de autenticación va directamente a la configuración de inicio de sesión del sistema WEB_INBOUND, que se consta de todos los módulos de inicio de sesión combinados en la Figura 1. La Figura 1 muestra dónde puede conectar los módulos de inicio de sesión personalizados y dónde se necesitan los módulos de inicio de sesión ltpaLoginModule y wsMapDefaultInboundLoginModule.Figura 1. Configuración de inicio de sesión WEB_INBOUND - Manejar solicitudes de salida con la configuración de inicio de sesión RMI_OUTBOUND.
La configuración de inicio de sesión RMI_OUTBOUND es un punto de conexión para manejar solicitudes salientes. WebSphere Application Server utiliza este punto de conexión para crear la información serializada que se envía en sentido descendente según el sujeto de invocación que se ha pasado y otra información de contexto de seguridad, como por ejemplo, las señales de propagación. Un módulo de inicio de sesión personalizado puede utilizar este punto de conexión para cambiar la identidad. Para obtener más información, consulte Configuración de la correlación de identidad de salida con un reino de destino. La Figura 2 muestra dónde se pueden conectar los módulos de inicio de sesión personalizados y muestra dónde se necesita el módulo de inicio de sesión wsMapCSIv2OutboundLoginModule.
Figura 2. Configuración de inicio de sesión RMI_OUTBOUNDPara obtener más información acerca de la configuración de inicio de sesión RMI_OUTBOUND, incluidos sus retornos de llamada asociados, consulte "RMI_OUTBOUND" en Valores de entrada de configuración de inicio de sesión del sistema de JAAS (Java Authentication and Authorization Service).
- Maneje la autenticación de entrada para las solicitudes de enterprise bean
con la configuración de inicio de sesión RMI_INBOUND.
La configuración de inicio de sesión RMI_INBOUND es un punto de conexión que gestiona la autenticación entrante para las peticiones de enterprise bean. WebSphere Application Server utiliza este punto de conexión para un inicio de sesión inicial o un inicio de sesión de propagación. Para obtener más información sobre estos dos tipos de inicio de sesión, consulte Propagación de atributos de seguridad. Durante un inicio de sesión de propagación, este punto de conexión se utiliza para deserializar la información recibida de un servidor en sentido ascendente. Un módulo de inicio de sesión personalizado puede utilizar este punto de conexión para cambiar la identidad, manejar señales personalizadas, añadir objetos personalizados al Asunto, y así sucesivamente. Para obtener más información acerca de cómo modificar la identidad utilizando un objeto Hashtable, al que se hace referencia en la Figura 3, consulte Configuración de la correlación de identidad de entrada. La Figura 3 muestra dónde se pueden conectar los módulos de inicio de sesión personalizados y muestra que se necesitan los módulos de inicio de sesión ltpaLoginModule y wsMapDefaultInboundLoginModule.
Figura 3. Configuración de inicio de sesión RMI_INBOUNDPara obtener más información acerca de la configuración de inicio de sesión RMI_INBOUND, incluidas las llamadas de retorno asociadas, consulte "RMI_INBOUND, WEB_INBOUND, DEFAULT" en Valores de entrada de configuración de inicio de sesión del sistema de JAAS (Java Authentication and Authorization Service).
- Maneje todos los demás tipos de solicitudes de autenticación con la configuración de inicio de
sesión DEFAULT. Configuración de inicio de sesión DEFAULT
La configuración de inicio de sesión DEFAULT es un punto de conexión que maneja todos los demás tipos de solicitudes de autenticación, incluidas las solicitudes SOAP administrativas y la autenticación interna del ID de servidor. Los inicios de sesión de propagación no suelen producirse en este punto de conexión.
Para obtener más información sobre la configuración de inicio de sesión DEFAULT incluidas sus retornos de llamada asociados, consulte "RMI_INBOUND, WEB_INBOUND, DEFAULT" en Valores de entrada de configuración de inicio de sesión del sistema de JAAS (Java Authentication and Authorization Service).
- Desarrolle la lógica de configuración de inicio de sesión para saber cuándo existe
información específica y cómo utilizar la información. Escribir un módulo de inicio de sesiónCuando grabe un módulo de inicio de sesión que se conecta a una configuración de inicio de sesión del sistema o de inicio de sesión de la aplicación WebSphere Application Server, lea el modelo de programación JAAS, que encontrará en http://java.sun.com/products/jaas. El modelo de programación JAAS proporciona información básica sobre JAAS. No obstante, antes de escribir un módulo de inicio de sesión para el entorno de WebSphere Application Server, lea los siguientes apartados:
- Retornos de llamada utilizables
- Variables de estado compartido
- Comparación entre inicios de sesión iniciales e inicios de sesión de propagación
- Módulo de inicio de sesión personalizado de ejemplo
Devoluciones de llamada utilizables
Cada configuración de inicio de sesión debe documentar los retornos de llamada que reconoce la configuración de inicio de sesión. No obstante, los retornos de llamada no son siempre los datos pasados. La configuración de inicio de sesión debe contener la lógica para saber cuándo está presente información específica y cómo utilizar la información. Por ejemplo, si escribe un módulo de inicio de sesión personalizado que puede conectarse a las cuatro configuraciones de inicio de sesión preconfiguradas del sistema mencionadas anteriormente, podrían aparecer tres retornos de llamada para autenticar una petición. Podrían aparecer otros retornos de llamada por otras razones, incluida la propagación y hacer disponible otra información en la configuración de inicio de sesión.
La información de inicio de sesión se puede presentar en las siguientes combinaciones:- Nombre de usuario (NameCallback) y contraseña (PasswordCallback)
- Esta información es una combinación de autenticación típica.
- Sólo nombre de usuario (NameCallback)
- Esta información se utiliza en la aserción de identidad, en los inicios de sesión de interceptor de asociación de confianza (TAI) y los inicios de sesión de certificados.
- Señal (WSCredTokenCallbackImpl)
- Esta información se utiliza para la validación de señales LTPA (Lightweight Third Party Authentication).
- Lista de señales de propagación (WSTokenHolderCallback)
- Esta información se utiliza para un inicio de sesión de propagación.
Las tres primeras combinaciones se utilizan en las autenticaciones típicas. No obstante, cuando aparece la llamada de retorno WSTokenHolderCallback además de una de las tres primeras combinaciones de información, el inicio de sesión se denomina un inicio de sesión de propagación. Un inicio de sesión de propagación significa que algunos atributos de seguridad se propagan a este servidor desde otro servidor. Los servidores pueden reutilizar estos atributos de seguridad si la información de autenticación se valida satisfactoriamente. En algunos casos, es posible que una llamada de retorno WSTokenHolderCallback no tenga suficientes atributos para un inicio de sesión completo. Compruebe el método requiresLogin en la llamada de retorno WSTokenHolderCallback para determinar si se necesita un nuevo inicio de sesión. Siempre puede ignorar la información devuelta por el método requiresLogin pero, como resultado, es posible que duplique la información. La lista siguiente contiene las llamadas de retorno que pueden aparecer en las configuraciones de inicio de sesión del sistema. La lista incluye el nombre de retorno de llamada y una descripción de su responsabilidad.- callbacks[0] = new javax.security.auth.callback.NameCallback("Username: ");
- Este manejador de devolución de llamada recopila el nombre de usuario del inicio de sesión. El resultado puede ser el nombre de usuario de un inicio de sesión de autenticación básica (nombre de usuario y contraseña) o el nombre de usuario de un inicio de sesión de aserción de identidad.
- callbacks[1] = new javax.security.auth.callback.PasswordCallback("Password: ", false);
- Este manejador de devolución de llamada recopila la contraseña del inicio de sesión.
- callbacks[2] = new com.ibm.websphere.security.auth.callback.WSCredTokenCallbackImpl("Credential Token:");
- Este manejador de devolución de llamada recopila la señal LTPA (Lightweight Third Party Authentication) u otro tipo de señal del inicio de sesión. Este manejador de retorno de llamada generalmente está presente cuando no hay un nombre de usuario y una contraseña.
- callbacks[3] = new com.ibm.wsspi.security.auth.callback.WSTokenHolderCallback("Authz Token List:");
- Este manejador de devolución de llamada recopila la ArrayList de los objetos TokenHolder que devuelve una llamada a la API WSOpaqueTokenHelper.createTokenHolderListFromOpaqueToken utilizando la señal de autorización CSIv2 (Common Secure Interoperability versión 2) como entrada.
- callbacks[4] = new com.ibm.websphere.security.auth.callback.WSServletRequestCallback("HttpServletRequest:" );
- Este manejador de devolución de llamada recopila el objeto de solicitud de servlet HTTP, si existe. Este manejador de retorno de llamada permite a los módulos de inicio de sesión obtener información de la petición HTTP para utilizarla durante el inicio de sesión y se presenta únicamente desde la configuración de inicio de sesión de WEB_INBOUND.
- callbacks[5] = new com.ibm.websphere.security.auth.callback.WSServletResponseCallback("HttpServletResponse:");
- Este manejador de devolución de llamada recopila el objeto de respuesta de servlet HTTP, si existe. Este manejador de retorno de llamada permite a los módulos de inicio de sesión añadir información en la respuesta HTTP como resultado del inicio de sesión. Un ejemplo de esta situación puede ser la adición del cookie SingleSignonCookie a la respuesta. Este manejador de retorno de llamada existe sólo en la configuración de inicio de sesión WEB_INBOUND.
- callbacks[6] = new com.ibm.websphere.security.auth.callback.WSAppContextCallback("ApplicationContextCallback:");
- Este manejador de devolución de llamada recopila el contexto de la aplicación web utilizado durante el inicio de sesión. Este manejador de retorno de llamada consta de un objeto HashMap, que contiene el nombre de aplicación y la dirección web de redirección, si existe. Este manejador de retorno de llamada existe sólo en la configuración de inicio de sesión WEB_INBOUND.
- callbacks[7] = new WSRealmNameCallbackImpl("Realm Name:", default_realm);
- Este manejador de retorno de llamada recopila el nombre de reino de la información de inicio de sesión. Es posible que la información de reino no se proporcione siempre. Si no se proporciona la información de reino, presuponga que es el reino actual.
- callbacks[8] = new WSX509CertificateChainCallback("X509Certificate[]: ");
- Este manejador de devolución de llamada contiene el certificado que se ha validado mediante SSL (Secure Sockets Layer) si el origen de inicio de sesión es un X509Certificate de la autenticación del cliente SSL. ltpaLoginModule llama a las mismas funciones de correlación que en los releases de WebSphere Application Server anteriores a la versión 6.1. No obstante, cuando se pasa al inicio de sesión proporciona a un módulo de inicio de sesión personalizado la oportunidad de correlacionar el certificado de un modo personalizado. A continuación, efectúa un inicio de sesión de Hashtable. Consulte Configuración de la correlación de identidad de entrada para obtener más información acerca de un inicio de sesión de Hashtable.
- Utilice variables de estado compartido para compartir información entre los módulos de inicio de
sesión durante la fase de inicio de sesión. Si desea acceder a los objetos que crea WebSphere Application Server durante un inicio de sesión, consulte las siguientes variables de estado compartido. Las variables se establecen en los siguientes módulos de inicio de sesión: ltpaLoginModule, swamLoginModule y wsMapDefaultInboundLoginModule.
- Variable de estado compartido
- com.ibm.wsspi.security.auth.callback.Constants.WSPRINCIPAL_KEY
- Finalidad
- Especifica el objeto com.ibm.websphere.security.auth.WSPrincipal. Consulte la documentación de la API de WebSphere Application Server para obtener información acerca de cómo utilizar la API (interfaz de programación de aplicaciones). Esta variable de estado compartido es a fines sólo de lectura. No establezca esta variable en el estado compartido para los módulos de inicio de sesión personalizados.
- El módulo de inicio de sesión en el que se establecen las variables
- ltpaLoginModule, swamLoginModule y wsMapDefaultInboundLoginModule
- Variable de estado compartido
- com.ibm.wsspi.security.auth.callback.Constants.WSCREDENTIAL_KEY
- Finalidad
- Especifica el objeto com.ibm.websphere.security.cred.WSCredential. Consulte la documentación de la API de WebSphere Application Server acerca de cómo utilizar la API. Esta variable de estado compartido es a fines sólo de lectura. No establezca esta variable en el estado compartido para los módulos de inicio de sesión personalizados.
- Módulo de inicio de sesión en que se establecen variables:
- wsMapDefaultInboundLoginModule
- Variable de estado compartido
- com.ibm.wsspi.security.auth.callback.Constants.WSAUTHZTOKEN_KEY
- Finalidad
- Especifica el objeto com.ibm.wsspi.security.token.AuthorizationToken por omisión. Los módulos de inicio de sesión pueden utilizar este objeto para establecer los atributos personalizados que se conectan después de wsMapDefaultInboundLoginModule. La información que se define aquí se propaga en sentido descendente y está disponible para la aplicación. Consulte la documentación de la API de WebSphere Application Server acerca de cómo utilizar la API.
Comparación entre inicios de sesión iniciales e inicios de sesión de propagación
Como se ha mencionado previamente, algunos inicios de sesión se consideran inicios de sesión iniciales por los siguientes motivos:- Es la primera vez que se presenta información de autenticación a WebSphere Application Server.
- La información de inicio de sesión se recibe desde un servidor que no propaga atributos de seguridad, por lo que esta información se debe recopilar desde un registro de usuario.
Otros inicios de sesión se consideran inicios de sesión de propagación cuando existe un retorno de llamada WSTokenHolderCallback que contiene información suficiente de un servidor emisor para volver a crear todos los objetos que necesita el tiempo de ejecución de WebSphere Application Server. En los casos en que haya información suficiente para el tiempo de ejecución de WebSphere Application Server, es probable que la información que añada al sujeto se conserve del inicio de sesión anterior. Para verificar si el objeto está presente, puede obtener acceso al objeto ArrayList presente en WSTokenHolderCallback y buscar cada método TokenHolder getName en esta lista. Esta búsqueda se utiliza para determinar si WebSphere Application Server deserializa el objeto personalizado durante este inicio de sesión. Compruebe el nombre de clase que devuelve el método getName mediante el método startsWith de Serie porque es posible que durante la ejecución se añada información adicional al final del nombre para saber el Asunto que se ha establecido y añadir el objeto personalizado después de la deserialización.
- Codifique el método login() para determinar cuándo hay suficiente información.
El siguiente fragmento de código se puede utilizar en el método login() para determinar cuándo hay suficiente información. Si desea ver otro ejemplo, consulte Configuración de la correlación de identidad de entrada.
// Esto es una indicación proporcionada por WebSphere Application Server // que no hay suficiente información de propagación y, por consiguiente, // es necesario un inicio de sesión para proporcionar la información suficiente. En este // caso, se puede utilizar un inicio de sesión de tabla hash. boolean requiresLogin = ((com.ibm.wsspi.security.auth.callback. WSTokenHolderCallback) callbacks[1]).requiresLogin(); if (requiresLogin) { // Compruebe si el objeto existe en la lista TokenHolder, en caso contrario, añádala. java.util.ArrayList authzTokenList = ((WSTokenHolderCallback) callbacks[6]). getTokenHolderList();boolean found = false; if (authzTokenList != null) { Iterator tokenListIterator = authzTokenList.iterator(); while (tokenListIterator.hasNext()) { com.ibm.wsspi.security.token.TokenHolder th = (com.ibm.wsspi.security.token. TokenHolder) tokenListIterator.next(); if (th != null && th.getName().startsWith("com.acme.myCustomClass")) { found=true; break; } } if (!found) { // seguir adelante y añadir el objeto personalizado. } } } else { // Este código indica que hay suficiente información de propagación. // WebSphere Application Server no necesita llamadas de registro de usuarios // para crear un Asunto válido. Este código puede que sea no-op en el módulo de inicio de sesión. }
Módulo de inicio de sesión personalizado de ejemplo
Puede utilizar el siguiente ejemplo para obtener ideas sobre cómo utilizar algunos de los retornos de llamada y las variables de estado compartido.
{ // Define las variables del módulo de inicio de sesión com.ibm.wsspi.security.token.AuthenticationToken customAuthzToken = null; com.ibm.wsspi.security.token.AuthenticationToken defaultAuthzToken = null; com.ibm.websphere.security.cred.WSCredential credential = null; com.ibm.websphere.security.auth.WSPrincipal principal = null; private javax.security.auth.Subject _subject; private javax.security.auth.callback.CallbackHandler _callbackHandler; private java.util.Map _sharedState; private java.util.Map _options; public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { _subject = subject; _callbackHandler = callbackHandler; _sharedState = sharedState; _options = options; } public boolean login() throws LoginException { boolean succeeded = true; // Obtiene la información de CALLBACK javax.security.auth.callback.Callback callbacks[] = new javax.security. auth.callback.Callback[7]; callbacks[0] = new javax.security.auth.callback.NameCallback( "Username: "); callbacks[1] = new javax.security.auth.callback.PasswordCallback( "Password: ", false); callbacks[2] = new com.ibm.websphere.security.auth.callback. WSCredTokenCallbackImpl( "Credential Token: "); callbacks[3] = new com.ibm.wsspi.security.auth.callback. WSServletRequestCallback ("HttpServletRequest: "); callbacks[4] = new com.ibm.wsspi.security.auth.callback. WSServletResponseCallback ("HttpServletResponse: "); callbacks[5] = new com.ibm.wsspi.security.auth.callback. WSAppContextCallback ("ApplicationContextCallback: "); callbacks[6] = new com.ibm.wsspi.security.auth.callback. WSTokenHolderCallback ("Authz Token List: "); try { callbackHandler.handle(callbacks); } catch (Exception e) { // Maneja las excepciones throw new WSLoginFailedException (e.getMessage(), e); } // Observa qué devoluciones de llamada (callbacks) contienen información uid = ((NameCallback) callbacks[0]).getName(); char password[] = ((PasswordCallback) callbacks[1]).getPassword(); byte[] credToken = ((WSCredTokenCallbackImpl) callbacks[2]).getCredToken(); javax.servlet.http.HttpServletRequest request = ((WSServletRequestCallback) callbacks[3]).getHttpServletRequest(); javax.servlet.http.HttpServletResponse response = ((WSServletResponseCallback) callbacks[4]).getHttpServletResponse(); java.util.Map appContext = ((WSAppContextCallback) callbacks[5]).getContext(); java.util.List authzTokenList = ((WSTokenHolderCallback) callbacks[6]).getTokenHolderList(); // Obtiene la información de SHARED STATE principal = (WSPrincipal) _sharedState.get(com.ibm.wsspi.security. auth.callback.Constants.WSPRINCIPAL_KEY); credential = (WSCredential) _sharedState.get(com.ibm.wsspi.security. auth.callback.Constants.WSCREDENTIAL_KEY); defaultAuthzToken = (AuthorizationToken) _sharedState.get(com.ibm. wsspi.security.auth.callback.Constants.WSAUTHZTOKEN_KEY); // Lo que se tiende a hacer con esta información depende de la situación // que se intenta conseguir. Este ejemplo demuestra cómo // acceder a otra información diferente: // - Determina si un inicio de sesión es inicial o de propagación // - Deserializa una señal de autorización personalizada (para más información, consulte // Propagación de atributos de seguridad // - Añade una nueva señal de autorización personalizada (para más información, consulte // Propagación de atributos de seguridad // - Busca un WSCredential y lee los atributos, si se encuentran. // - Busca un WSPrincipal y lee los atributos, si se encuentran. // - Busca un AuthorizationToken predeterminado y añade atributos, si se encuentran. // - Lee los atributos de cabecera de HttpServletRequest, si se encuentran. // - Añade un atributo a HttpServletResponse, si se encuentra. // - Obtiene el nombre de aplicación web a partir de appContext, si se encuentra. // - Determina si un inicio de sesión es inicial o de propagación. Esto es muy // útil cuando el módulo de inicio de sesión es el primero. boolean requiresLogin = ((WSTokenHolderCallback) callbacks[6]).requiresLogin(); // inicio de sesión inicial - certifica los atributos de privilegio de acuerdo con la identidad del usuario if (requiresLogin) { // Si valida una señal desde otro servidor, existe una // interfaz de programas de aplicación (API) para obtener el uniqueID del mismo. if (credToken != null && uid == null) { try { String uniqueID = WSSecurityPropagationHelper. validateLTPAToken(credToken); String realm = WSSecurityPropagationHelper.getRealmFromUniqueID (uniqueID); // Establézcalo en el UID para que pueda utilizarlo para correlacionar o // iniciar la sesión. uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueID); } catch (Exception e) { // tratar excepción } } // Añade una tabla hash a un estado compartido. // Nota: puede realizar una correlación personalizada en el valor devuelto de NameCallback // para cambiar la identidad de acuerdo con reglas de correlación propias. uid = mapUser (uid); // Obtiene el InitialContext predeterminado de este servidor. javax.naming.InitialContext ctx = new javax.naming.InitialContext(); // Obtiene el objeto UserRegistry local. com.ibm.websphere.security.UserRegistry reg = (com.ibm.websphere.security. UserRegistry) ctx.lookup("UserRegistry"); // Obtiene el uniqueID del registro de usuarios de acuerdo con el uid especificado // en NameCallback. String uniqueid = reg.getUniqueUserId(uid); uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueID); // Obtiene el nombre de visualización del registro de usuarios de acuerdo con el uniqueID. String securityName = reg.getUserSecurityName(uid); // Obtiene los grupos asociados a este uniqueID. java.util.List groupList = reg.getUniqueGroupIds(uid); // Crea java.util.Hashtable con la información recopilada // de UserRegistry. java.util.Hashtable hashtable = new java.util.Hashtable(); hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_UNIQUEID, uniqueid); hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_SECURITYNAME, securityName); hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_GROUPS, groupList); // Añade una clave de memoria caché que se utiliza como parte del mecanismo de búsqueda // para el asunto creado. La clave de memoria caché puede ser un objeto, pero debería // implementar el método toString(). Asegúrese de que cacheKey contiene // información suficiente que abarque el ámbito del usuario y de cualquier // atributo adicional que se utilice. Si no especifica esta propiedad, el // asunto se asigna como ámbito en el WSCREDENTIAL_UNIQUEID devuelto, por omisión. hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_CACHE_KEY, "myCustomAttribute" + uniqueid); // Añade la tabla de totales de control a sharedState del sujeto. _sharedState.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_PROPERTIES_KEY,hashtable); } // inicio de sesión de propagación - señales propagadas de proceso else { // - Deserializa una señal de autorización personalizada. Para obtener más información, consulte // Propagación de atributos de seguridad. // Esto se puede hacer en cualquier punto de conexión de módulo de inicio de sesión // (primero, medio o último). if (authzTokenList != null) { // Se itera en la lista buscando la señal personalizada for (int i=0; i<authzTokenList.size(); i++) { TokenHolder tokenHolder = (TokenHolder)authzTokenList.get(i); // Busca el nombre y la versión de la implementación de AuthorizationToken // personalizada if (tokenHolder.getName().equals("com.ibm.websphere.security.token. CustomAuthorizationTokenImpl") && tokenHolder.getVersion() == 1) { // Pasa los bytes al constructor de AuthorizationToken personalizado // que se ha de deserializar customAuthzToken = new com.ibm.websphere.security.token. CustomAuthorizationTokenImpl(tokenHolder.getBytes()); } } } // Añade una nueva señal de autorización personalizada (parar más información, // consulte Propagación de atributos de seguridad) // Esto se puede hacer en cualquier punto de conexión del módulo de inicio de sesión // (primero, medio o último). else { // Obtiene el PRINCIPAL del AuthenticationToken predeterminado. Debe coincidir // con todas las señales. defaultAuthToken = (com.ibm.wsspi.security.token.AuthenticationToken) sharedState.get(com.ibm.wsspi.security.auth.callback.Constants. WSAUTHTOKEN_KEY); String principal = defaultAuthToken.getPrincipal(); // Añade una nueva señal de autorización personalizada. Se trata de una conexión inicial. // Pasa el principal al constructor customAuthzToken = new com.ibm.websphere.security.token. CustomAuthorizationTokenImpl(principal); // Añade los atributos iniciales if (customAuthzToken != null) { customAuthzToken.addAttribute("key1", "value1"); customAuthzToken.addAttribute("key1", "value2"); customAuthzToken.addAttribute("key2", "value1"); customAuthzToken.addAttribute("key3", "something different"); } } } // - Busca un WSCredential y lee los atributos, si se encuentran. // Es muy útil cuando se conecta como el último módulo de inicio de sesión. if (credential != null) { try { // Lee datos de la credencial String securityName = credential.getSecurityName(); java.util.ArrayList = credential.getGroupIds(); } catch (Exception e) { // Maneja las excepciones throw new WSLoginFailedException (e.getMessage(), e); } } // - Busca un WSPrincipal y lee los atributos, si se encuentran. // Es muy útil cuando se conecta como el último módulo de inicio de sesión. if (principal != null) { try { // Lee datos de la credencial String principalName = principal.getName(); } catch (Exception e) { // Maneja las excepciones throw new WSLoginFailedException (e.getMessage(), e); } } // - Busca un AuthorizationToken por omisión y añade atributos, si se encuentran. // Es muy útil cuando se conecta como el último módulo de inicio de sesión. if (defaultAuthzToken != null) { try { // Lee datos del defaultAuthzToken String[] myCustomValue = defaultAuthzToken.getAttributes ("myKey"); // Añade datos si no existen en el defaultAuthzToken if (myCustomValue == null) defaultAuthzToken.addAttribute ("myKey", "myCustomData"); } catch (Exception e) { // Maneja las excepciones throw new WSLoginFailedException (e.getMessage(), e); } } // - Lee los atributos de cabecera de HttpServletRequest, si se encuentran. // Esto se puede hacer en cualquier punto de conexión del módulo de inicio de sesión // (primero, medio o último). if (request != null) { java.util.Enumeration headerEnum = request.getHeaders(); while (headerEnum.hasMoreElements()) { System.out.println ("Header element: " + (String)headerEnum.nextElement()); } } // - Añade un atributo a HttpServletResponse, si se encuentra // Esto se puede hacer en cualquier punto de conexión de módulo de inicio de sesión // (primero, medio o último). if (response != null) { response.addHeader ("myKey", "myValue"); } // - Obtiene el nombre de aplicación web del appContext, si se encuentra // Esto se puede hacer en cualquier punto de conexión de módulo de inicio de sesión // (primero, medio o último). if (appContext != null) { String appName = (String) appContext.get(com.ibm.wsspi.security.auth. callback.Constants.WEB_APP_NAME); } return succeeded; } public boolean commit() throws LoginException { boolean succeeded = true; // Aquí se añaden objetos que se han creado y que pertenecen al // actual. Asegúrese de que los objetos no se han añadido ya. Si ha añadido // variables sharedState, elimínelas antes de salir. Si se llama al método abort(), // asegúrese de que limpia cualquier cosa añadida al // sujeto. if (customAuthzToken != null) { // Establece la señal customAuthzToken en el asunto try { // Hágalo en un bloque de código doPrivileged para que el código de aplicación // no necesite añadir permisos adicionales java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() { public Object run() { try { // Añade la señal de autorización personalizada si no es // nula y todavía no está en Subject if ((customAuthzTokenPriv != null) && (!_subject.getPrivateCredentials().contains(customAuthzTokenPriv))) { _subject.getPrivateCredentials().add(customAuthzTokenPriv); } } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } return null; } }); } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } } return succeeded; } public boolean abort() throws LoginException { boolean succeeded = true; // Asegúrese de eliminar todos los objetos que se hayan añadido (en el asunto // y en el estado compartido). if (customAuthzToken != null) { // Elimine la señal customAuthzToken del asunto try { final AuthorizationToken customAuthzTokenPriv = customAuthzToken; // Realice esta operación en un bloque doPrivileged para que la aplicación // no necesite añadir permisos adicionales java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() { public Object run() { try { // Elimina la señal de autorización personalizada si no es // nulo y aún no está en el asunto if ((customAuthzTokenPriv != null) && (_subject.getPrivateCredentials(). contains(customAuthzTokenPriv))) { _subject.getPrivateCredentials(). remove(customAuthzTokenPriv); } } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } return null; } }); } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } } return succeeded; } public boolean logout() throws LoginException { boolean succeeded = true; // Elimina todos los objetos que ya se hayan añadido // (en Subject y estado compartido). if (customAuthzToken != null) { // Elimina la señal customAuthzToken de Subject try { final AuthorizationToken customAuthzTokenPriv = customAuthzToken; // Realice esta operación en un bloque de código doPrivileged para que la aplicación // no necesite añadir permisos adicionales java.security.AccessController.doPrivileged(new java.security. PrivilegedAction() { public Object run() { try { // Elimina la señal de autorización personalizada si no es nula y // y todavía no está en el asunto if ((customAuthzTokenPriv != null) && (_subject. getPrivateCredentials(). contains(customAuthzTokenPriv))) { _subject.getPrivateCredentials().remove(customAuthzTokenPriv); } } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } return null; } }); } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } } return succeeded; } }
- Configure el inicio de sesión del sistema para el módulo de inicio de sesión
personalizado.
Después de desarrollar el módulo de inicio de sesión personalizado para una configuración de inicio de sesión del sistema, puede configurar el inicio de sesión del sistema utilizando la consola administrativa o el programa de utilidad wsadmin. Para configurar el 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. Para obtener más información sobre cómo utilizar el programa de utilidad wsadmin para la configuración de inicio de sesión del sistema, consulte Personalización de una configuración de inicio de sesión y autenticación de Java Authentication and Authorization Service de servidor. Consulte también ese artículo para obtener información sobre los módulos de inicio de sesión de sistema y para determinar si se deben añadir módulos de inicio de sesión adicionales.
Subtopics
Personalización de inicio de sesión de aplicaciones con Java Authentication and Authorization Service
Mediante JAAS (Java Authentication and Authorization Service), puede personalizar el inicio de sesión de las aplicaciones.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_jaascustlogmod
File name: tsec_jaascustlogmod.html