Generación y consumo de señales personalizadas con los módulos genéricos de inicio de sesión de emisión
El generador y el consumidor genéricos de señales emitidas, GenericIssuedTokenGenerateLoginModule y GenericIssuedTokenConsumeLoginModule, pueden utilizarse junto con las SPI GenericSecurityTokenFactory i GenericSecurityToken para implementar una solución integral para una señal personalizada. La generación y el consumo de señales con los módulos genéricos de inicio de sesión de emisión pueden realizarse con política y enlaces o WSSAPI.
Antes de empezar
Debe tener un conjunto de aplicaciones de cliente y proveedor de servicio JAX-WS en funcionamiento donde añadir las clases de módulo de inicio de sesión JAAS nuevas.
Acerca de esta tarea
Complete los pasos siguientes si desea habilitar un conjunto de aplicaciones de cliente y proveedor de servicio JAX-WS para utilizar una señal personalizada. En estos pasos MyToken es el nombre de la señal que se está creando.
- Se crean dos módulos de inicio de sesión JAAS; uno para generar la señal y uno para consumirla.
- La señal se genera y consume con la ayuda del consumidor y el generador de señales emitidas genéricas.
- A continuación, se aplican restricciones de seguridad a las aplicaciones con conjuntos y enlaces de políticas.
Procedimiento
- Cree el módulo de inicio de sesión JAAS de generador siguiente y póngalo a disposición para el código de aplicación
package test.tokens; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.login.LoginException; import javax.security.auth.spi.LoginModule; import javax.xml.soap.SOAPFactory; import javax.xml.soap.SOAPElement; import javax.xml.namespace.QName; import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory; import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken; public class MyCustomGenerator implements LoginModule { private Map _sharedState; private Map _options; private CallbackHandler _handler; public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) { this._handler = callbackHandler; this._sharedState = sharedState; this._options = options; } public boolean login() throws LoginException { GenericSecurityTokenFactory factory = null; try { factory = GenericSecurityTokenFactory.getInstance(); } catch(Exception e) { throw new LoginException(e.toString()); } if (factory == null) { throw new LoginException("GenericSecurityTokenFactory.getInstance() returned null"); } SecurityToken myToken = null; try { SOAPElement tokenElement = createCustomElement(factory); myToken = factory.getToken(tokenElement, new QName("http://www.acme.com","MyToken")); } catch(Exception e) { throw new LoginException(e.toString()); } if (myToken == null) { throw new LoginException("myToken is null"); } //Coloque la señal en una lista en el estado compartido donde estará disponible para ser utilizada por los //módulos de inicio de sesión apilados factory.putGeneratorTokenToSharedState(_sharedState, myToken); return true; } private SOAPElement createCustomElement(GenericSecurityTokenFactory gstFactory) throws Exception { /* <acme:MyToken xmlns:acme="http://www.acme.com" xmlns:utl="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" utl:Id="cust_3"> <acme:EMail>joe.smith@acme.com</acme:EMail> </acme:MyToken> */ SOAPFactory factory = SOAPFactory.newInstance(); //Crear el elemento MyToken SOAPElement tokElement = factory.createElement("MyToken", "acme", "http://www.acme.com"); //Añadir el atributo ID tokElement.addAttribute(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Id", "utl"), gstFactory.createUniqueId()); //Crear el elemento Email SOAPElement emailElement = factory.createElement("Email", "acme", "http://www.acme.com"); emailElement.addTextNode("joe.smith@acme.com"); //Añadir el elemento EMail a MyToken tokElement.addChildElement(emailElement); return tokElement; } public boolean logout() throws LoginException { return false; } public boolean abort() throws LoginException { return false; } public boolean commit() throws LoginException { return true; } }
- Cree el módulo de inicio de sesión JAAS de consumidor siguiente y póngalo a disposición para el código de aplicación
package test.tokens; import java.util.Map; import javax.xml.namespace.QName; import org.apache.axiom.om.OMElement; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.login.LoginException; import javax.security.auth.spi.LoginModule; import com.ibm.websphere.wssecurity.callbackhandler.PropertyCallback; import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory; import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken; import com.ibm.wsspi.wssecurity.wssapi.OMStructure; public class MyCustomConsumer implements LoginModule { private CallbackHandler _handler; private Map _sharedState; public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) { this._handler = callbackHandler; this._sharedState = sharedState; } public boolean login() throws LoginException { PropertyCallback propertyCallback = new PropertyCallback(null); Callback[] callbacks = new Callback[] { propertyCallback}; try { this._handler.handle(callbacks); } catch(Exception e) { throw new LoginException(e.toString()); } //Obtener GenericSecurityTokenFactory GenericSecurityTokenFactory factory = null; try { factory = GenericSecurityTokenFactory.getInstance(); } catch(Exception e) { throw new LoginException(e.toString()); } if (factory == null) { throw new LoginException("GenericSecurityTokenFactory.getInstance() returned null"); } //Obtener la señal consumida por GenericIssuedConsumeLoginModule SecurityToken myToken = factory.getConsumerTokenFromSharedState(_sharedState, new QName("http://www.acme.com","MyToken")); if (myToken == null) { throw new LoginException("no token"); } //Obtener el elemento de señal Object obj = myToken.getXML(); if (obj == null) { throw new LoginException("token is empty"); } if (!(obj instanceof OMStructure)) { throw new LoginException("XML is not OMStructure"); } OMElement tokenElement = ((OMStructure)obj).getNode(); //puede utilizar el método org.apache.axis2.util.XMLUtils.toDOM //si desea trabajar con un elemento w3c.dom en lugar de un //elemento Axiom //Lleve a cabo procedimientos en el contenido del elemento de señal OMElement el = tokenElement.getFirstChildWithName(new QName("http://www.acme.com","Email")); if (el == null) { throw new LoginException("no email element"); } String value = el.getText(); if (value != null && value.equals("joe.smith@acme.com")) { return true; } else { throw new LoginException("email value is bad"); } } public boolean commit() throws LoginException { return true; } public boolean logout() throws LoginException { return false; } public boolean abort() throws LoginException { return false; } }
- Crear nuevas configuraciones de inicio de sesión JAAS.
- En la consola administrativa, seleccione Seguridad-> Seguridad global.
- En Autenticación, seleccione Servicio de autenticación y autorización Java.
- Seleccione Inicios de sesión de sistema.
- Cree primer el generador con el módulo personalizado.
- Pulse Nuevo y, a continuación, especifique Alias = test.generate.custom.
- Pulse Nuevo y, a continuación, especifique Module class name = test.tokens.MyCustomGenerator.
- Seleccione Utilizar proxy de módulo de inicio de sesión .
- Pulse OK (Aceptar).
- Pulse Nuevo y, a continuación, seleccione Module class name = com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenGenerateLoginModule.
- Pulse Aceptar.
- Pulse JAAS - Inicios de sesión del sistema.
- Cree el consumidor con el módulo personalizado en último lugar.
- Pulse Nuevo y, a continuación, especifique Alias = test.consume.custom.
- Pulse Nuevo y, a continuación, seleccione Module class name = com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenConsumeLoginModule.
- Pulse Nuevo y, a continuación, especifique Module class name = test.tokens.MyCustomConsumer.
- Seleccione Utilizar proxy de módulo de inicio de sesión .
- Pulse Aceptar.
- Pulse Guardar.
- Cree el conjunto de políticas personalizado.
- En la consola administrativa, pulse Servicios > Conjuntos de políticas > Conjuntos de políticas de aplicación.
- Pulse Nuevo y, a continuación, especifique ACustomTokenPolicy.
- Pulse Aplicar.
- En Políticas, pulse Añadir > WS-Security.
- Edite el conjunto de políticas personalizado.
- En la consola administrativa, pulse WS-Security > Política principal.
- Elimine los elementos no deseados:
- Deseleccione Incluir indicación de fecha y hora en la cabecera de seguridad.
- Desmarque Protección de nivel de mensaje.
- Añada la señal personalizada.
- Pulse Políticas de señal de solicitud
- Pulse Añadir tipo de señal > Personalizada y, a continuación, especifique:
- Nombre de señal personalizada = myToken
- Parte local = MyToken
- URI de espacio de nombres = http://www.acme.com
- Pulse Aceptar.
- Pulse Guardar.
- Configure el cliente para utilizar el conjunto de políticas ACustomTokenPolicy.
- En la consola administrativa, pulse Servicios > Clientes de servicio.
- Pulse en el cliente de servicio deseado.
- Seleccione el recurso en el nivel superior.
- Pulse Conectar conjunto de políticas.
- Seleccione ACustomTokenPolicy
- Cree un enlace personalizado para el cliente.
- Vuelva a seleccionar el recurso en el nivel superior.
- Pulse Asignar enlace.
- Pulse Nuevo enlace específico de la aplicación para crear un enlace específico de la aplicación.
- Especifique el nombre de configuración de los enlaces.
name: customTokenClientBinding
- Pulse Añadir > WS-Security.
Si el panel Enlaces de política de seguridad de mensajes principales no se muestra, seleccione WS-Security.
- Configure los enlaces personalizados del cliente.
- Seleccione Autenticación y protección > request:myToken.
- Seleccione JAAS login = test.generate.custom.
- Pulse Aplicar.
- Pulse Manejador de retorno de llamada.
- Añada la propiedad personalizada passThroughToken=true.
- Configure el proveedor para utilizar el conjunto de políticas ACustomTokenPolicy.
- En la consola administrativa, pulse Servicios > Proveedores de servicios.
- Pulse en el proveedor de servicio deseado.
- Seleccione el recurso en el nivel superior.
- Pulse Conectar conjunto de políticas.
- Seleccione ACustomTok enPolicy.
- Cree un enlace personalizado para el proveedor.
- Vuelva a seleccionar el recurso en el nivel superior.
- Pulse Asignar enlace.
- Pulse Nuevo enlace específico de la aplicación para crear un enlace específico de la aplicación.
- Especifique el nombre de configuración de los enlaces.
customTokenProviderBinding
- Pulse Añadir > WS-Security.
Si el panel Enlaces de política de seguridad de mensajes principales no se muestra, seleccione WS-Security.
- Configure los enlaces personalizados para el proveedor.
- Seleccione Autenticación y protección > request:myToken.
- Seleccione JAAS login = test.consume.custom.
- Pulse Aplicar.
- Pulse Manejador de retorno de llamada.
- Añada las propiedades personalizadas passThroughToken=true y alwaysGeneric=true.
- Pulse Guardar para guardar los cambios realizados en la configuración.
- Reinicie el servidor de aplicaciones para aplicar los cambios de configuración JAAS.
- Pruebe el servicio.
Ejemplo
El ejemplo siguiente ilustra la cabecera de seguridad SOAP que se produce al seguir el procedimiento anterior.
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
<acme:MyToken xmlns:acme="http://www.acme.com" xmlns:utl="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" utl:Id="cust_3">
<acme:Email>joe.smith@acme.com</acme:Email>
</acme:MyToken>
</wsse:Security>


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