Puede correlacionar el nombre principal de cliente Kerberos con el ID del registro de usuarios de
WebSphere tanto para la autenticación Web SPNEGO (Simple and Protected GSS-API Negotiation) como para la
autenticación Kerberos.
Acerca de esta tarea
Utilice el módulo de inicio de sesión personalizado JAAS
(Java Authentication and Authorization Service) para realizar una
correlación personalizada de un nombre principal de cliente Kerberos
con la identidad del registro de usuarios de WebSphere. El módulo de inicio de sesión personalizado JAAS es
un mecanismo de plug-in que está definido para la autenticación de solicitudes entrantes en
WebSphere Application Server. Si el mecanismo de autenticación activo es LTPA, el módulo de inicio
de sesión personalizado JAAS se inserta inmediatamente antes de
ltpaLoginModule.
Si el mecanismo de autenticación activo es Kerberos, el módulo de inicio de sesión
personalizado JAAS se inserta inmediatamente antes de WSKrb5LoginModule.
El módulo de inicio de sesión personalizado JAAS recupera un nombre principal de cliente
Kerberos en javax.security.auth.Subject mediante el método
subject.getPrivateCredentials(KRBAuthnToken.class).
El módulo de inicio de sesión personalizado JAAS correlaciona el nombre principal de
cliente Kerberos con la identidad del registro de usuarios de WebSphere e inserta la
identidad de correlación en la propiedad de la tabla hash
com.ibm.wsspi.security.cred.userId.
A continuación, wsMapDefaultInboundLoginModule utiliza la identidad
correlacionada para crear WSCredential.
Nota: Para la
autenticación Web SPNEGO, el módulo de inicio de sesión personalizado
también puede proporcionar el conjunto completo de propiedades de
seguridad de javax.security.auth.Subject en
com.ibm.wsspi.security.tai.TAIResult para confirmar por
completo la identidad correlacionada. Una vez confirmada totalmente
la identidad, wsMapDefaultInboundLoginModule
correlaciona dichas propiedades de seguridad con un WSCredential.
- Consulte el siguiente ejemplo de un módulo de inicio de
sesión personalizado:
package com.ibm.websphere.security;
import java.util.Map;
import java.lang.reflect.Array;
import javax.security.auth.Subject;
import javax.security.auth.callback.*;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import javax.security.auth.kerberos.*;
import com.ibm.websphere.security.auth.WSLoginFailedException;
import com.ibm.wsspi.security.token.AttributeNameConstants;
import com.ibm.wsspi.wssecurity.platform.token.KRBAuthnToken;
/**
*
* @author IBM Corporation
* @version 1.0
* @since 1.0
*
*/
public class sampleSpnegoMappingLoginModule implements LoginModule {
/*
*
* Constante que representa el nombre de este módulo de correlación. Si se utiliza
* este código de ejemplo para crear una clase con otro nombre, este valor debe cambiarse.
*
*/
private final static String MAPPING_MODULE_NAME = "com.ibm.websphere.security.sampleSpnegoMappingLoginModule";
private String mapUid = null;
/**
* Crear un objeto WSLoginModuleImpl no inicializado.
*/
public sampleSpnegoMappingLoginModule() {
debugOut("sampleSpnegoMappingLoginModule() entry");
debugOut("sampleSpnegoMappingLoginModule() exit");
}
/**
* Inicializar este módulo de inicio de sesión.
*
*
* LoginContext realiza una llamada a este método después de que se instancie
* este módulo de inicio de sesión. La información relevante se pasa de LoginContext
* a este módulo de inicio de sesión. Si el módulo de inicio de sesión no comprende los datos
* almacenados en los parámetros sharedState y options,
* se pueden ignorar.
*
*
* @param subject The subject to be authenticated.
* @param callbackHandler
* Un CallbackHandler para comunicarse con el usuario final para recopilar información de inicio de sesión
(por ejemplo, nombre de usuario y contraseña).
* @param sharedState
* Estado compartido con otros módulos de inicio de sesión configurados.
* @param options Opciones especificadas en la configuración de inicio de sesión de este módulo de inicio de sesión concreto.
*/
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options) {
debugOut("initialize(subject = \"" + subject.toString() +
"\", callbackHandler = \"" + callbackHandler.toString() +
"\", sharedState = \"" + sharedState.toString() +
"\", options = \"" + options.toString() + "\")");
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
this.options = options;
debug = "true".equalsIgnoreCase((String)this.options.get("debug"));
debugOut("initialize() exit");
}
/**
*
* Método para autenticar un asunto (fase 1).
*
*
*
* Este método autentica un asunto. Utiliza CallbackHandler para recopilar información
* sobre el asunto, como el nombre de usuario y la contraseña y verificar
* esta información. El resultado de la autenticación se guarda en estado privado dentro de
* este módulo de inicio de sesión.
*
*
* @return true si la autenticación ha sido satisfactoria o false
* si se debe ignorar este módulo de inicio de sesión.
* @exception LoginException
* Si falla la autenticación.
*/
public boolean login() throws LoginException
{
debugOut("sampleSpnegoMappingLoginModule.login() entry");
boolean succeeded = false;
KRBAuthnToken krbAuthnToken = null;;
java.util.Set krb5Principals= subject.getPrivateCredentials(KRBAuthnToken.class);
java.util.Iterator krb5PrincIter = krb5Principals.iterator();
while (krb5PrincIter.hasNext()) {
krbAuthnToken = (KRBAuthnToken)krb5PrincIter.next();
String kerbPrincipal = (String) krbAuthnToken.getTokenPrincipal() + "@" + krbAuthnToken.getTokenRealm();
debugOut("Kerberos principal name: "+ kerbPrincipal.toString());
if (kerbPrincipal!= null && kerbPrincipal.equals("utle@WSSEC.AUSTIN.IBM.COM")){
mapUid = "user1";
debugOut("mapUid: "+mapUid);
java.util.Hashtable customProperties = (java.util.Hashtable)
sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
if (customProperties == null) {
customProperties = new java.util.Hashtable();
}
succeeded = true;
customProperties.put(AttributeNameConstants.WSCREDENTIAL_USERID, mapUid);
Map<String,java.util.Hashtable>mySharedState=(Map<String,java.
util.Hashtable>)sharedState;
mySharedState.put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY,
customProperties);
debugOut("Añadir un ID de usuario de correlación a Hashtable, ID de correlación = "+mapUid);
debugOut("login() custom properties = " + customProperties);
}
}
succeeded = true;
debugOut("sampleSpnegoMappingLoginModule.login() exit");
return succeeded;
}
/**
*
* Método para comprometer el resultado de la autenticación (fase 2).
*
*
*
* Este método se invoca si la autenticación general de LoginContext ha sido
* satisfactoria (el módulo de inicio de sesión REQUIRED, REQUISITE, SUFFICIENT y OPTIONAL
* se ha realizado correctamente).
*
*
* @return true si el compromiso ha sido satisfactorio, o false
* si se debe ignorar este módulo de inicio de sesión.
* @exception LoginException
* Si falla el compromiso.
*/
public boolean commit() throws LoginException
{
debugOut("commit()");
debugOut("commit()");
return true;
}
/**
* Método para terminar anormalmente el proceso de autenticación (fase 2).
*
*
* Este método se invoca si la autenticación general de LoginContext ha sido
* errónea (el módulo de inicio de sesión REQUIRED, REQUISITE, SUFFICIENT y OPTIONAL
* no se ha ejecutado correctamente).
*
*
*
*Si el intento de autenticación de este módulo de inicio de sesión ha sido correcto, este método
* limpia el estado anterior guardado en la fase 1.
*
*
* @return true si la finalización anómala ha sido satisfactoria, o false
* si se debe ignorar este módulo de inicio de sesión.
* @exception LoginException
* Si falla la finalización anómala.
*/
public boolean abort() throws LoginException {
debugOut("abort() entry");
debugOut("abort() exit");
return true;
}
/**
* Método que finaliza la sesión de un sujeto.
*
* @return true si la finalización de sesión ha sido satisfactoria, o false
* si se debe ignorar este módulo de inicio de sesión.
* @exception LoginException
* Si falla la desconexión.
*/
public boolean logout() throws LoginException
{
debugOut("logout() entry");
debugOut("logout() exit");
return true;
}
private void cleanup()
{
debugOut("cleanup() entry");
debugOut("cleanup() exit");
}
/*
*
* Método privado para imprimir la información de rastreo. Esta implementación utiliza System.out
* para imprimir la información de rastreo en la salida estándar, pero un sistema de rastreo personalizado puede
* implementarse aquí también.
*
*/
private void debugOut(Object o)
{
System.out.println("Debug: " + MAPPING_MODULE_NAME);
if (o != null) {
if (o.getClass().isArray()) {
int length = Array.getLength(o);
for (int i = 0; i < length; i++) {
System.out.println("\t" + Array.get(o, i));
}
} else {
System.out.println("\t" + o);
}
}
}
private Subject subject;
private CallbackHandler callbackHandler;
private Map sharedState;
private Map options;
protected boolean debug = false;
}
- Para la autenticación web SPNEGO sin la autenticación Kerberos, este módulo de inicio de sesión
personalizado JAAS se debe insertar primero inmediatamente antes de ltpaLoginModule en el inicio de sesión de
pila para la configuración de inicio de sesión del sistema para WEB_INBOUND, RMI_INBOUND y DEFAULT.
- Para la autenticación Kerberos, este módulo de inicio de sesión personalizado JAAS
se debe insertar inmediatamente antes de WSKrb5LoginModule para la configuración de
inicio de sesión del sistema para WEB_INBOUND, RMI_INBOUND y DEFAULT.