Ejemplo: módulo de inicio de sesión de señal de autenticación
En este ejemplo se muestra cómo determinar si el inicio de sesión es inicial o de propagación.
Para obtener información sobre los pasos de inicialización, inicio de sesión y confirmación a seguir, consulte Desarrollo de módulos de inicio de sesión personalizados para una configuración de inicio de sesión del sistema para JAAS
public customLoginModule()
{
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options)
{
_sharedState = sharedState;
}
public boolean login() throws LoginException
{
// Maneja WSTokenHolderCallback para ver si se trata de una
// conexión inicial o de propagación.
Callback callbacks[] = new Callback[1];
callbacks[0] = new WSTokenHolderCallback("Authz Token List: ");
try
{
callbackHandler.handle(callbacks);
}
catch (Exception e)
{
// Maneja la excepción
}
// Recibe los objetos ArrayList de TokenHolder (las señales serializadas)
List authzTokenList = ((WSTokenHolderCallback) callbacks[0]).getTokenHolderList();
if (authzTokenList != null)
{
// Se itera en la lista buscando la señal personalizada
for (int i=0; i<authzTokenList.size(); i++)
{
TokenHolder tokenHolder = (TokenHolder)authzTokenList.get(i);
// Busca el nombre y la versión de la implementación de AuthenticationToken
// personalizada
if (tokenHolder.getName().equals("your_oid_name") && tokenHolder.getVersion() == 1)
{
// Pasa los bytes en el constructor de AuthenticationToken personalizado
// que se ha de deserializar
customAuthzToken = new
com.ibm.websphere.security.token.
customAuthenticationTokenImpl(tokenHolder.getBytes());
}
}
}
else
// Esta no es una conexión de propagación. Crea una instancia nueva de la implementación
// de AuthenticationToken
{
// Obtiene el principal de AuthenticationToken predeterminado. Este principal
// debe coincidir con todos las señales predeterminadas.
// Nota: Durante la ejecución WebSphere Application Server sólo lo aplica a
// las señales predeterminadas. De este modo, puede optar por hacerlo para
// las señales personalizadas aunque no es necesario.
defaultAuthToken = (com.ibm.wsspi.security.token.AuthenticationToken)
sharedState.get(com.ibm.wsspi.security.auth.callback.Constants.WSAUTHTOKEN_KEY);
String principal = defaultAuthToken.getPrincipal();
// Añade una señal de autenticación personalizado nuevo. Se trata de una conexión inicial. Pasa
// el principal en el constructor
customAuthToken = new com.ibm.websphere.security.token.
CustomAuthenticationTokenImpl(principal);
// Añade los atributos iniciales
if (customAuthToken != null)
{
customAuthToken.addAttribute("key1", "value1");
customAuthToken.addAttribute("key1", "value2");
customAuthToken.addAttribute("key2", "value1");
customAuthToken.addAttribute("key3", "something different");
}
}
// Nota: Puede añadir la señal al asunto durante la confirmación por si
// sucede algo durante la conexión.
}
public boolean commit() throws LoginException
{
if (customAuthToken != null)
{
// Establece la señal customAuthToken en el asunto
try
{
private final AuthenticationToken customAuthTokenPriv = customAuthToken;
// Realícelo en un bloque de código doPrivileged para que el código de aplicación
// no necesite añadir permisos adicionales
java.security.AccessController.doPrivileged(new java.security.PrivilegedAction()
{
public Object run()
{
try
{
// Añade la señal de autenticación personalizado si no es
// nulo y aún no está en el asunto
if ((customAuthTokenPriv != null) &&
(!subject.getPrivateCredentials().
contains(customAuthTokenPriv)))
{
subject.getPrivateCredentials().add(customAuthTokenPriv);
}
}
catch (Exception e)
{
throw new WSLoginFailedException (e.getMessage(), e);
}
return null;
}
});
}
catch (Exception e)
{
throw new WSLoginFailedException (e.getMessage(), e);
}
}
}
// Define las variables del módulo de inicio de sesión
com.ibm.wsspi.security.token.AuthenticationToken customAuthToken = null;
com.ibm.wsspi.security.token.AuthenticationToken defaultAuthToken = null;
java.util.Map _sharedState = null;
}