Ejemplo: Módulo de conexión personalizado para la correlación de entrada
Este ejemplo muestra un módulo de conexión personalizado que crea una tabla de totales de control java.util.Hashtable basada en el retorno de llamada NameCallback especificado. La tabla de totales de control java.util.Hashtable se añade a la correlación java.util.Map de sharedState para que los módulos de inicio de sesión de WebSphere Application Server puedan ubicar la información en la tabla de totales de control.
public customLoginModule()
{
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options)
{
// (Para obtener más información sobre la inicialización, consulte
// Desarrollo de módulos de inicio de sesión personalizados para una configuración de inicio de sesión del sistema para JAAS.)
_sharedState = sharedState;
}
public boolean login() throws LoginException
{
// (Para obtener más información sobre los pasos a seguir durante la conexión, consulte
// Desarrollo de módulos de inicio de sesión personalizados para una configuración de inicio de sesión del sistema para JAAS.)
// Maneja WSTokenHolderCallback para ver si se trata de una
// conexión inicial o de propagación.
javax.security.auth.callback.Callback callbacks[] =
new javax.security.auth.callback.Callback[3];
callbacks[0] = new javax.security.auth.callback.NameCallback("");
callbacks[1] = new javax.security.auth.callback.PasswordCallback(
"Password: ", false);
callbacks[2] = new com.ibm.websphere.security.auth.callback.
WSCredTokenCallbackImpl("");
callbacks[3] = new com.ibm.wsspi.security.auth.callback.
WSTokenHolderCallback("");
try
{
callbackHandler.handle(callbacks);
}
catch (Exception e)
{
// Maneja la excepción
}
// Determina qué devoluciones de llamada contienen información
boolean identitySwitched = false;
String uid = ((NameCallback) callbacks[0]).getName();
char password[] = ((PasswordCallback) callbacks[1]).getPassword();
byte[] credToken = ((WSCredTokenCallbackImpl) callbacks[2]).getCredToken();
java.util.List authzTokenList = ((WSTokenHolderCallback) callbacks[3]).
getTokenHolderList();
if (credToken != null)
{
try
{
String uniqueID = WSSecurityPropagationHelper.validateLTPAToken(credToken);
String realm = WSSecurityPropagationHelper.getRealmFromUniqueID (uniqueID);
// Establece ahora la serie a UID para poder utilizar el resultado para
// la correlación o el inicio de sesión.
uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueid);
}
catch (Exception e)
{
// tratar excepción
}
}
else if (uid == null)
{
// Los datos de autenticación no son válidos. Debe tener el UID
// o el CredToken
throw new WSLoginFailedException("invalid authentication data.");
}
else if (uid != null && password != null)
{
// Es una autenticación típica. Puede elegir la correlación de este ID
// con otro ID o puede evitarla y permitir que WebSphere Application Server
// inicie la sesión automáticamente. Cuando las contraseñas estén presentes, tenga sumo
// en no validar la contraseña porque ésta es la autenticación inicial.
return true;
}
// Puede correlacionar este uid con algo distinto y establecer el booleano
// identitySwitched. Si se ha modificado la identidad, borre los siguientes atributos
// propagados para que no se utilicen incorrectamente.
uid = myCustomMappingRoutine (uid);
// Borrar los atributos propagados porque ya no son aplicables a la nueva identidad
if (identitySwitched)
{
((WSTokenHolderCallback) callbacks[3]).setTokenHolderList(null);
}
boolean requiresLogin = ((com.ibm.wsspi.security.auth.callback.
WSTokenHolderCallback) callbacks[2]).getRequiresLogin();
if (requiresLogin || identitySwitched)
{
// Recupera InitialContext por omisión para este servidor.
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
// Recupera el objeto UserRegistry local.
com.ibm.websphere.security.UserRegistry reg =
(com.ibm.websphere.security.UserRegistry) ctx.lookup("UserRegistry");
// Recupera el uniqueID de registro basado en el uid especificado
// en NameCallback.
String uniqueid = reg.getUniqueUserId(uid);
uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueid);
// Recupera el nombre de visualización del registro de usuario basado en el uniqueID.
String securityName = reg.getUserSecurityName(uid);
// Recupera los grupos asociados a este uniqueID.
java.util.List groupList = reg.getUniqueGroupIds(uid);
// Crea java.util.Hashtable con la información que ha recopilado
// 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 tiene
// tener un método toString implementado. Asegúrese de que cacheKey contiene
// información suficiente para abarque el ámbito del usuario y de cualquier atributo
// adicional que utilice. Si no especifica esta propiedad, por omisión, el ámbito del asunto será el valor de
// WSCREDENTIAL_UNIQUEID devuelto.
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_CACHE_KEY, "myCustomAttribute" + uniqueid);
// Añade la tabla de totales de control al estado compartido del asunto.
_sharedState.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_PROPERTIES_KEY,hashtable);
}
else if (requiresLogin == false)
{
// Para obtener más información sobre esta sección, consulte
// Propagación de atributos de seguridad.
// Si ha añadido una implementación de señal personalizada, puede buscar en
// la lista de contenedores de señales para deserializarla.
// Nota: los objetos Java se deserializan automáticamente con
// wsMapDefaultInboundLoginModule
for (int i=0; i<authzTokenList.size(); i++)
{
TokenHolder tokenHolder = (TokenHolder) authzTokenList.get(i);
if (tokenHolder.getName().equals("com.acme.MyCustomTokenImpl"))
{
byte[] myTokenBytes = tokenHolder.getBytes();
// Pasa estos bytes al constructor para que la clase de
implementación
// realice la deserialización.
com.acme.MyCustomTokenImpl myTokenImpl = new com.acme.MyCustomTokenImpl(myTokenBytes);
}
}
}
}
public boolean commit() throws LoginException
{
// (Para obtener más información sobre los pasos a seguir durante la confirmación, consulte
// Desarrollo de módulos de inicio de sesión personalizados para una configuración de inicio de sesión del sistema para JAAS.)
}
// Define las variables del módulo de inicio de sesión
com.ibm.wsspi.security.token.AuthorizationToken customAuthzToken = null;
com.ibm.wsspi.security.token.AuthenticationToken defaultAuthToken = null;
java.util.Map _sharedState = null;
}