Desarrollo de un proveedor de autenticación JASPI personalizado
Puede desarrollar un proveedor de autenticación JASPI (Java™ Authentication SPI for Containers) creando clases que implemente las interfaces necesarias indicadas en la especificación JSR 196: Java Authentication Service Provider Interface for Containers.
Antes de empezar
Revise los requisitos de implementación de la interfaz específicos de los proveedores de autenticación JASPI y módulos en la especificación JSR 196: Java Authentication Service Provider Interface for Containers.
Acerca de esta tarea
WebSphere Application Server permite utilizar proveedores de autenticación de terceros compatibles con el perfil de contenedor de servlet especificado en JASPI (Java Authentication SPI for Containers) Versión 1.1.
El perfil de contenedor de servlet define las interfaces que se utilizan en el entorno de ejecución de seguridad en colaboración con el contenedor web en WebSphere Application Server para invocar los módulos de autenticación antes y después que una aplicación procese una solicitud web. Mediante los módulos de autenticación JASPI sólo se realiza la autenticación cuando se ha habilitado JASPI en la configuración de seguridad y cuando un proveedor JASPI configurado se ha asociado al módulo web que procesa la solicitud web recibida.
Para desarrollar un proveedor de autenticación personalizado, cree las clases que implementan las interfaces necesarias indicadas en la especificación JSR 196: Java Authentication Service Provider Interface for Containers. Un proveedor puede utilizar uno o más módulos de autenticación para la autenticación. Para realizar la autenticación los módulos pueden realizar el retorno de llamada o pueden añadir manualmente la información de identidad de usuario necesaria al asunto del cliente. En función del ámbito del proveedor, las clases de implementación se pueden almacenar en ubicaciones diferentes en el servidor de aplicaciones.
Procedimiento
- Cree una clase que implemente la interfaz javax.security.auth.message.config.AuthConfigProvider. La clase de implementación AuthConfigProvider debe definir un constructor de dos argumentos público y el método público getServerAuthConfig:
import java.util.Map; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.message.AuthException; import javax.security.auth.message.config.AuthConfigFactory; import javax.security.auth.message.config.AuthConfigProvider; import javax.security.auth.message.config.ServerAuthConfig; public class SampleAuthConfigProvider implements AuthConfigProvider { public SampleAuthConfigProvider(Map<String, String> properties, AuthConfigFactory factory) { ... } public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException { ... } }
WebSphere Application Server utiliza una instancia de la clase de implementación AuthConfigProvider cuando llega una solicitud que ha de procesar el módulo web de la aplicación. El método getServerAuthConfig se utiliza para obtener una instancia de ServerAuthConfig. El argumento CallbackHandler de la llamada al método lo utiliza el o los módulos de autenticación.
- Cree una clase que implemente la interfaz javax.security.auth.message.config.ServerAuthConfig. La clase de implementación ServerAuthConfig debe definir los métodos públicos getAuthContextID y getAuthContext:
import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.MessageInfo; import javax.security.auth.message.config.ServerAuthConfig; import javax.security.auth.message.config.ServerAuthContext; public class SampleServerAuthConfig implements ServerAuthConfig { public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException { ... } public ServerAuthContext getAuthContext(String authContextID, Subject serviceSubject, Map properties) throws AuthException { ... } }
Los métodos getAuthContextID y getAuthContext de la clase de implementación ServerAuthConfig se utilizan para obtener una instancia de ServerAuthContext.
- Cree una clase que implemente la interfaz javax.security.auth.message.config.ServerAuthContext. La clase de implementación ServerAuthContext debe definir los métodos públicos validateRequest y secureResponse:
import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import javax.security.auth.message.config.ServerAuthContext; public class SampleServerAuthContext implements ServerAuthContext { public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... } public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException { ... } }
El método validateRequest de la clase de implementación ServerAuthContext se utiliza para invocar el módulo que autentica el mensaje de solicitud web recibido. Si el resultado de la autenticación es satisfactorio, el contenedor web entrega el mensaje de solicitud web recibido, el cual procesa el módulo web de destino en la aplicación. Si el resultado de la autenticación no es satisfactorio, se rechaza la solicitud con el estado de respuesta correspondiente.
- Cree una clase que implemente la interfaz javax.security.auth.message.module.ServerAuthModule. La clase de implementación ServerAuthModule debe definir los métodos públicos initialize, validateRequest y secureResponse:
import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import javax.security.auth.message.MessagePolicy; import javax.security.auth.message.module.ServerAuthModule; public class SampleAuthModule implements ServerAuthModule { public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler handler, Map options) throws AuthException { ... } public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... } public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException { ... } }
El método initialize de la clase de implementación ServerAuthModule lo invoca la clase de implementación ServerAuthContext para inicializar el módulo de autenticación y para asociarlo con la instancia ServerAuthContext.
Los métodos validateRequest y secureResponse de esta clase se utilizan respectivamente para autenticar el javax.servlet.http.HttpServletRequest y javax.servlet.http.HttpServletResponse contenidos en el javax.security.auth.message.MessageInfo recibido. Estos métodos pueden utilizar la instancia CallbackHandler recibida en el método initialize para interactuar con el tiempo de ejecución de seguridad de WebSphere para validar una contraseña del usuario, y el registro de usuarios activos para recuperar un id exclusivo y los grupos de pertenencia de un usuario. Los datos recuperados se colocan en una tabla hash en el conjunto de credenciales privadas del asunto del cliente. La implementación de CallbackHandler por parte WebSphere Application Server admite tres devoluciones de llamada:- CallerPrincipalCallback
- GroupPrincipalCallback
- PasswordValidationCallback
Si el módulo de autenticación no utiliza CallbackHandler y validateRequest devuelve un estado de satisfactorio, WebSphere Application Server requiere que se incluya una instancia de Hashtable el clientSubject con información de identidad de usuario para que se puede realizar un inicio de sesión personalizado obtener las credenciales para el usuario. Esta Hashtable se puede añadir al asunto de cliente como en el ejemplo siguiente:import java.util.Hashtable; import java.util.String; import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import com.ibm.wsspi.security.registry.RegistryHelper; import com.ibm.wsspi.security.token.AttributeNameConstants.AttributeNameConstants; public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... UserRegistry reg = RegistryHelper.getUserRegistry(null); String uniqueid = reg.getUniqueUserID(username); Hashtable hashtable = new Hashtable(); hashtable.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uniqueid); hashtable.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username); hashtable.put(AttributeNameConstants.WSCREDENTIAL_PASSWORD, password); hashtable.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, groupList); //optional clientSubject.getPrivateCredentials().add(hashtable); ... }
Para obtener más información acerca de los requisitos de Hashtable y de inicio de sesión personalizado, consulte la información acerca del Desarrollo de módulos de inicio de sesión personalizados para una configuración de inicio de sesión del sistema para JAAS.
Para dar soporte al método de autenticación de la especificación Java Servlet 3.0, se debe añadir la siguiente lógica al método validateRequest de la clase de implementación ServerAuthModule:import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import javax.servlet.http.HttpServletRequest; public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... Map msgMap = messageInfo.getMap(); if ("authenticate".equalsIgnoreCase(msgMap.get("com.ibm.websphere.jaspi.request"))) { // esta solicitud es para el método de autenticación String authHeader = ((HttpServletRequest) messageInfo.getRequestMessage()).getHeader("Authorization"); if (authHeader == null) { // El usuario aún no ha proporcionado un nombre de usuario y contraseña, devolver // AuthStatus.SEND_CONTINUE para desafío } else { // Autenticar utilizando el nombre de usuario y la contraseña de la cabecera de autenticación } } else { // Esta no es una petición de autenticación Servlet 3.0; manejar de forma habitual. } ... }
- Compilar todas las clases creadas recientemente. Los siguientes archivos JAR de la instalación de WebSphere Application Server deben especificarse en la vía de clase para compilar satisfactoriamente las nuevas clases:
- raíz_servidor_aplicaciones/dev/JavaEE/j2ee.jar
- raíz_servidor_aplicaciones/dev/was_public.jar (si se han utilizado API públicas de WebSphere)
- Crear un archivo JAR con las clases compiladas. En función de los requisitos, el archivo JAR puede colocarse en una de las tres ubicaciones siguientes:
- raíz_servidor_aplicaciones/lib
Esta ubicación siempre se encuentra en la classpath del cargador de clases de WebSphere Application Server. Utilizando esta ubicación, el proveedor puede registrarse para un conjunto de módulos web o aplicaciones como el proveedor predeterminado de célula o de dominio para todos los módulos web y aplicaciones, y se puede registrar manualmente como un proveedor de persistencia.
- Biblioteca compartida
Coloque el archivo JAR del proveedor en cualquier lugar del sistema WebSphere Application Server. Configure una biblioteca compartida que apunte al archivo JAR, y añada esta biblioteca compartida a la classpath de la aplicación o servidor. En una biblioteca compartida, el proveedor puede registrarse para un conjunto de módulos web o aplicaciones, pero el proveedor no se puede utilizar como el proveedor predeterminado de la célula o del dominio. Tampoco se puede registrar como un proveedor de persistencia debido a que la biblioteca compartida no está en la classpath del registro del proveedor durante el arranque del servidor. Para obtener más información acerca de cómo configurar una biblioteca compartida, consulte la sección Creación de bibliotecas compartidas.
- Incorporado en la aplicación
Incluya el archivo JAR del proveedor en el archivo EAR de la aplicación como un programa de utilidad JAR o incorpore los archivos de clase compilados en el WAR del módulo web. El proveedor incorporado se puede registrar para los módulos web de la siempre que las clases estén incluidas en la classpath del módulo web. Este proveedor no se puede utilizar como un proveedor predeterminado de la célula o del dominio, ni se puede registrar como un proveedor de persistencia. Las clases de la aplicación no están disponibles para el registro del proveedor durante el arranque del servidor.
- raíz_servidor_aplicaciones/lib
- Configure el proveedor en la configuración de seguridad mediante la consola administrativa o un
script de administración.
Consulte la sección Configuración de un proveedor de autenticación JASPI nuevo mediante la consola administrativa o Grupo de mandatos JaspiManagement para el objeto AdminTask para obtener más información.


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