Desarrollo de inicios de sesión programáticos con JAAS (Java Authentication and Authorization Service)
Utilice este tema para desarrollar inicios de sesión programáticos con Java™ Authentication and Authorization Service.
Antes de empezar
JAAS sustituye las API (interfaz de programación de aplicaciones) del inicio de sesión programático
de CORBA (Common Object Request Broker Architecture).
- Consulte el tema Desarrollo de aplicaciones que utilizan CosNaming (Interfaz de denominación CORBA) para obtener más información sobre cómo configurar el entorno para que las aplicaciones del cliente ligero accedan a los recursos remotos que están en un servidor.
- Si la aplicación utiliza una configuración de inicio de sesión JAAS personalizada, verifique que la configuración de inicio de sesión JAAS esté definida correctamente. Consulte Configuración de inicios de sesión mediante programa para JAAS (Java Authentication and Authorization Service) para obtener más información.
- Algunas de las API JAAS están protegidas por permisos de seguridad de Java 2. Si el código
de aplicación utiliza estas API, asegúrese de que se han añadido estos permisos al archivo
was.policy de la aplicación. Para obtener detalles, consulte los artículos siguientes: Si desea más información sobre las API protegidas por permisos de seguridad de Java 2, consulte la documentación de las API públicas de IBM® Developer Kit, Java Technology Edition, JAAS y WebSphere Application Server en el tema Seguridad: Recursos de aprendizaje.Algunas de las API utilizadas en el código de ejemplo de esta documentación y los permisos de seguridad de Java 2 que requieren estas API son las siguientes:
- Los constructores javax.security.auth.login.LoginContext están protegidos por el objeto javax.security.auth.AuthPermission "createLoginContext".
- Los métodos javax.security.auth.Subject.doAs y com.ibm.websphere.security.auth.WSSubject.doAs están protegidos por el objeto javax.security.auth.AuthPermission "doAs".
- Los métodos javax.security.auth.Subject.doAsPrivileged y com.ibm.websphere.security.auth.WSSubject.doAsPrivileged están protegidos por el objeto javax.security.auth.AuthPermission "doAsPrivileged".
- Modelo mejorado de recursos Java EE (Java Platform, Enterprise
Edition) para comprobaciones de autorización.
Debido a un error de diseño en JAAS Versión 1.0, el método javax.security.auth.Subject.getSubject no devuelve el Subject asociado a la hebra en ejecución incluida en un bloque de código java.security.AccessController.doPrivileged. Este error puede dar lugar a problemas de incoherencia, que puede tener efectos no deseados. La clase com.ibm.websphere.security.auth.WSSubject proporciona una solución alternativa que permite asociar el Subject con una hebra en ejecución. La clase com.ibm.websphere.security.auth.WSSubject amplía el modelo JAAS a los recursos de Java EE (Java Platform, Enterprise Edition) para las comprobaciones de autorización. Si el sujeto se asocia con la hebra en ejecución dentro del método com.ibm.websphere.security.auth.WSSubject.doAs o si el bloque de código com.ibm.websphere.security.auth.WSSubject.doAsPrivileged contiene credenciales del producto, se utiliza el sujeto en las comprobaciones de autorización de recursos Java EE.
- Soporte de interfaz de usuario para definir la nueva configuración
de inicio de sesión JAAS. Puede configurar una configuración de inicio de sesión JAAS en la consola administrativa y almacenar la configuración de inicio de sesión JAAS en un repositorio de configuración. Las aplicaciones pueden definir una nueva configuración de inicio de sesión JAAS en la consola administrativa y los datos persisten en el repositorio de configuración. No obstante, WebSphere Application Server continúa dando soporte al formato de configuración de inicio de sesión JAAS (archivo de texto plano) que proporciona la implementación predeterminada de JAAS. Si se han definido configuraciones de inicio de sesión duplicadas en formato de repositorio de configuración y de archivo de texto plano, ésta última tiene prioridad sobre la primera. Las ventajas de definir la configuración de inicio de sesión en el repositorio de configuración incluyen:
- Soporte de la consola administrativa para definir la configuración de inicio de sesión JAAS
- Gestión central de la configuración de inicio de sesión JAAS
- Distribución de la configuración de inicio de sesión JAAS
- Soporte de la autenticación programada por parte de las aplicaciones.
WebSphere Application Server proporciona configuraciones de inicio de sesión JAAS para que las aplicaciones realicen una autenticación programática en el tiempo de ejecución de seguridad de WebSphere. Estas configuraciones realizan a autenticación mediante el mecanismo de autenticación configurado para WebSphere Application Server SWAM (Simple WebSphere Authentication Mechanism, Lightweight Third Party Authentication (LTPA)) y el registro de usuarios (sistema operativo Local, Lightweight Directory Access Protocol (LDAP), registros personalizados o repositorios federados) y la autenticación de Kerberos basándose en los datos de autenticación que se proporcionan. El sujeto autenticado a partir de estas configuraciones de inicio de sesión JAAS contiene las credenciales y el principal necesarios que el tiempo de ejecución de seguridad de WebSphere puede utilizar para realizar comprobaciones de autorización en recursos protegidos basados en roles de Java EE.
Nota: SWAM está en desuso en WebSphere Application Server Versión 9.0 y se eliminará de releases futuros.A continuación se indican las configuraciones de inicio de sesión JAAS proporcionadas por WebSphere Application Server:- Configuración de inicio de sesión JAAS de WSLogin. Una configuración de inicio de sesión JAAS genérica puede utilizar clientes Java, aplicaciones de contenedor de cliente, servlets, archivos JSP (JavaServer Pages) y componentes EJB (Enterprise JavaBeans) para realizar una autenticación basada en un ID de usuario y una contraseña, o una señal en el tiempo de ejecución de seguridad de WebSphere Application Server. No obstante, esta configuración no reconoce el manejador CallbackHandler especificado en el descriptor de despliegue del contenedor del cliente.
- Configuración de inicia de sesión JAAS de WSKRB5Login. Una configuración de inicio de sesión JAAS genérico puede utilizar clientes Java, aplicaciones de contenedor de cliente, servlets, archivos JSP (JavaServer Pages) y componentes EJB (Enterprise JavaBeans™) para realizar una autenticación basada en un ID de usuario y una contraseña o una señal en el tiempo de ejecución de seguridad de WebSphere Application Server. No obstante, esta configuración no reconoce el manejador CallbackHandler especificado en el descriptor de despliegue del contenedor del cliente.
- Configuración de inicio de sesión JAAS de ClientContainer. Esta
configuración de inicio de sesión JAAS reconoce el manejador
CallbackHandler especificado en el descriptor de despliegue del contenedor
del cliente. El módulo de inicio de sesión de esta configuración de inicio
de sesión utiliza el manejador CallbackHandler en el descriptor de
despliegue del contenedor del cliente, si se ha especificado uno, aunque
el código de aplicación haya especificado un manejador de retorno de
llamada en el contexto de inicio de sesión. Esto es para una aplicación de contenedor de cliente.
Un Sujeto autenticado con las configuraciones de inicio de sesión JAAS mencionadas anteriormente contiene un principal com.ibm.websphere.security.auth.WSPrincipal y una credencial com.ibm.websphere.security.cred.WSCredential. Si el sujeto autenticado se pasa en el método com.ibm.websphere.security.auth.WSSubject.doAs o en otros métodos doAs, el tiempo de ejecución de seguridad del producto puede realizar comprobaciones de autorización en recursos Java EE basándose en el sujeto com.ibm.websphere.security.cred.WSCredential.
- Configuraciones de inicio de sesión JAAS definidas por el cliente.
En su mecanismo de autenticación puede definir otras configuraciones de inicio de sesión JAAS que creen un asunto personalizado en el proceso de cliente o de servidor. Son necesarios determinados credenciales y principales en el sujeto para que los utilice el tiempo de ejecución de la seguridad del producto cuando envía información de autenticación desde el cliente a través de un protocolo o para el manejo de autorizaciones en el servidor. Las credenciales necesarias se generan desde los módulos de inicio de sesión suministrados.
El módulo de inicio de sesión necesario para un inicio de sesión de cliente Java puro es el siguiente:- com.ibm.ws.security.common.auth.module.WSLoginModuleImpl required;
- javax.security.auth.callback.NameCallback
- javax.security.auth.callback.PasswordCallback
Para obtener información acerca de cómo habilitar la propagación para un cliente Java puro, consulte el paso correspondiente de la sección Propagación de atributos de seguridad entre servidores de aplicaciones.Nota: Las clases añadidas al sujeto deben ser Java serializables y deserializables para que esto se lleve a cabo correctamente.Los módulos de inicio de sesión necesarios para un inicio de sesión de servidor son los siguientes:- com.ibm.ws.security.server.lm.ltpaLoginModule required;
- com.ibm.ws.security.server.lm.wsMapDefaultInboundLoginModule required;
- Requisitos de
denominación para el inicio de sesión programático en un cliente
Java puro.
Cuando se produce un inicio de sesión programático en un cliente Java puro y la propiedad com.ibm.CORBA.validateBasicAuth es igual a true, es necesario que el código de seguridad sepa dónde se encuentra SecurityServer. Normalmente, el InitialContext por omisión es suficiente cuando se establece una propiedad java.naming.provider.url como propiedad del sistema, o cuando se establece la propiedad en el archivo jndi.properties. En otros casos, no es deseable tener las mismas propiedades java.naming.provider.url establecidas en el ámbito de todo el sistema. En este caso, se debe especificar la información de rutina de carga específica de seguridad en el archivo sas.client.props. En los pasos siguientes se indica el orden de prioridad para determinar cómo buscar SecurityServer en un cliente Java puro:
Procedimiento
Ejemplo: inicios de sesión programados utilizando BasicAuth
Este ejemplo muestra cómo pueden realizar los programas de aplicación un inicio de sesión programático utilizando BasicAuth.
Añadir inicios de sesión programados con la señal Kerberos:
LoginContext lc = null;
try {
lc = new LoginContext("WSKRB5Login",
new WSCallbackHandlerImpl("userName", "password"));
} catch (LoginException le) {
System.out.println("Cannot create LoginContext. " + le.getMessage());
// Insertar el código de proceso de errores
} catch(SecurityException se) {
System.out.println("Cannot create LoginContext." + se.getMessage());
// Insertar el código de proceso de errores
}
try {
lc.login();
} catch (LoginException le) {
System.out.println("Fails to create Subject. " + le.getMessage());
// Insertar el código de proceso de errores
Tal como se muestra en el ejemplo, el nuevo contexto de inicio de sesión se inicializa con la configuración de inicio de sesión de WSKRB5Login y el manejador de retorno de llamada WSCallbackHandlerImpl. Utilice la instancia de WSCallbackHandlerImpl en una aplicación del lado del servidor donde no desee solicitudes. Se inicializará una instancia de WSCallbackHandlerImpl mediante el ID de usuario, la contraseña y la información de dominio especificada. La implementación de la clase Krb5LoginModuleWrapperClient actual que se especifica mediante la configuración de inicio de sesión de WSKRB5Login solamente puede recuperar la información de autenticación del manejador de retorno de llamada especificado. Puede construir un contexto de inicio de sesión con un objeto Asunto, pero la implementación de Krb5LoginModuleWrapperClient actual no tendrá en cuenta el objeto Subject.
Para obtener un cliente de aplicaciones Java puro, el producto proporciona dos implementaciones de manejador de retorno de llamada más: WSStdinCallbackHandlerImpl y WSGUICallbackHandlerImpl que solicitan el ID de usuario, la contraseña y la información de dominio en la línea de mandatos y en el panel emergente, respectivamente. Puede elegir una de estas implementaciones de manejador de retorno de llamada del producto, dependiendo del entorno de aplicación determinado. Puede desarrollar un nuevo manejador de retorno de llamada si ninguna de estas implementaciones se adapta a sus requisitos de aplicación.
Hay retornos de llamada adicionales que se pueden utilizar con WSKRB5Login, WSAuthMechOidCallbackImpl y WSCcacheCallBackHandlerImpl. WSAuthMechOidCallbackImpl permite especificar el OID del mecanismo de autenticación, el valor OID del mecanismo de autenticación de Kerberos es "1.2.840.113554.1.2.2". WSCcacheCallBackHandlerImpl permite especificar el nombre de usuario, el nombre de dominio Kerberos, la vía de acceso completa de la memoria caché de credenciales de Kerberos y si desea utilizar la ubicación predeterminada de la memoria caché de credenciales de Kerberos. Si decide utilizar la ubicación predeterminada de la memoria caché de credenciales de Kerberos, se omitirá la memoria caché de credenciales de Kerberos. Si va a utilizar Kerberos para la autenticación, deberá actualizar el archivo sas.client.props.
Asimismo, también puede desarrollar su propio módulo de inicio de sesión si la implementación de WSLoginModuleImpl predeterminada no puede cumplir todos sus requisitos. Este producto proporciona funciones de programa de utilidad que el módulo de inicio de sesión personalizado puede utilizar, que se describen en la sección siguiente.
En los casos en los que no haya ninguna propiedad java.naming.provider.url establecida como
propiedad de sistema o en el archivo jndi.properties, el contexto InitialContext predeterminado no funciona si el servidor del producto no está en la ubicación
localhost:2809. En este caso, cree un nuevo contexto InitialContext
mediante programación antes del inicio de sesión JAAS. JAAS debe reconocer
dónde reside el servidor de seguridad para verificar que el ID de usuario o
la contraseña introducidos son correctos antes de ejecutar un método
commit. Si crea un nuevo contexto InitialContext de la forma especificada más adelante en este tema, el código de seguridad tendrá la información necesaria
para encontrar la ubicación del
servidor de seguridad y el reino de destino.
En los casos en los que no se establece ninguna propiedad
java.naming.provider.url como propiedad de sistema o en el archivo
jndi.properties, un contexto InitialContext predeterminado no funcionará si el servidor
de producto no está en la ubicación nombre_servidor:2809. En este caso, cree un nuevo contexto InitialContext
mediante programación antes del inicio de sesión JAAS. JAAS debe reconocer
dónde reside el servidor de seguridad para verificar que el ID de usuario o
la contraseña introducidos son correctos antes de ejecutar un método
commit. Si crea un nuevo contexto InitialContext de la forma especificada más adelante en este tema, el código de seguridad tendrá la información necesaria
para encontrar la ubicación del
servidor de seguridad y el reino de destino.
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
...
// Ejecute una búsqueda de InitialContext y una búsqueda predeterminada antes de conectarse para
que el dominio de destino
// y el host/puerto se puedan determinar para la búsqueda de SecurityServer.
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL, "corbaloc:iiop:myhost.mycompany.com:2809");
Context initialContext = new InitialContext(env);
Object obj = initialContext.lookup("");
LoginContext lc = null;
try {
lc = new LoginContext("WSLogin",
new WSCallbackHandlerImpl("userName", "realm", "password"));
} catch (LoginException le) {
System.out.println("Cannot create LoginContext. " + le.getMessage());
// insertar código de proceso de error
} catch(SecurityException se) {
System.out.printlin("Cannot create LoginContext." + se.getMessage();
// insertar proceso de error
}
try {
lc.login();
} catch (LoginException le) {
System.out.printlin("Fails to create Subject. " + le.getMessage());
// insertar código de proceso de error
}