Exemplo: Módulo de Login Personalizado para Mapeamento de Entrada
Essa amostra mostra um módulo de login personalizado que cria uma tabela hash java.util.Hashtable baseada no retorno de chamada NameCallback especificado. O hashtable java.util.Hashtable é incluído no mapa sharedState java.util.Map para que os módulos de login do WebSphere Application Server possam localizar as informações no Hashtable.
public customLoginModule()
{
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options)
{
// (Para obter mais informações sobre inicialização, consulte
// Desenvolvendo Módulos de Login Customizado para uma Configuração de Login do Sistema para JAAS.)
_sharedState = sharedState;
}
public boolean login() throws LoginException
{
// (Para obter mais informações sobre o que fazer durante o login, consulte
// Desenvolvendo Módulos de Login Customizado para uma Configuração de Login do Sistema para JAAS.)
// Manipula o WSTokenHolderCallback para ver se este é um login inicial
// ou de propagação.
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)
{
// Manipula a exceção
}
// Determina quais retornos de chamadas contêm informações
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);
// Defina a cadeia como o UID para que você possa utilizar as informações para
// mapear ou efetuar login.
uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueid);
}
catch (Exception e)
{
// manipular a exceção
}
}
else if (uid == null)
{
// Os dados de autenticação não são válidos. Você deve ter um UID
// ou CredToken
throw new WSLoginFailedException("invalid authentication data.");
}
else if (uid != null && password != null)
{
// Essa é uma autenticação típica. É possível escolher mapear esse ID para
// outro ID ou ignorá-lo e permitir que o WebSphere Application Server
// efetue login por você. Quando as senhas forem apresentadas, tome cuidado para não
// validar a senha, porque esta é a autenticação inicial.
return true;
}
// É possível mapear esse uid para algo diferente e configurar o booleano
// identitySwitched. Se a identidade for alterada, limpe os seguintes atributos
// propagados para que não sejam utilizados incorretamente.
uid = myCustomMappingRoutine (uid);
// Limpe os atributos propagados porque eles não se aplicam mais à nova identidade
if (identitySwitched)
{
((WSTokenHolderCallback) callbacks[3]).setTokenHolderList(null);
}
boolean requiresLogin = ((com.ibm.wsspi.security.auth.callback.
WSTokenHolderCallback) callbacks[2]).getRequiresLogin();
if (requiresLogin || identitySwitched)
{
// Recupera o InitialContext padrão para esse servidor.
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
// Recupera o objeto UserRegistry local.
com.ibm.websphere.security.UserRegistry reg =
(com.ibm.websphere.security.UserRegistry) ctx.lookup("UserRegistry");
// Recupera o uniqueID de registro com base no uid especificado
// no NameCallback.
String uniqueid = reg.getUniqueUserId(uid);
uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueid);
// Recupera o nome de exibição do registro do usuário com base no uniqueID.
String securityName = reg.getUserSecurityName(uid);
// Recupera os grupos associados a esse uniqueID.
java.util.List groupList = reg.getUniqueGroupIds(uid);
// Cria java.util.Hashtable com as informações reunidas
// do 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);
// Inclui uma chave de cache que é utilizada como parte do mecanismo de consulta do
// para o Subject criado. A chave de cache pode ser um objeto, mas possui
// um método toString implementado. Certifique-se de que cacheKey contém
// informações suficientes para o escopo ao usuário e quaisquer atributos adicionais que
// estão sendo utilizados. Se você não especificar essa propriedade, o Subject é colocado no escopo do
// WSCREDENTIAL_UNIQUEID retornado, por padrão.
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_CACHE_KEY, "myCustomAttribute" + uniqueid);
// Inclui a tabela hash para o estado compartilhado do Subject.
_sharedState.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_PROPERTIES_KEY,hashtable);
}
else if (requiresLogin == false)
{
// Para obter mais informações sobre essa seção, consulte
// Propagação de Atributo de Segurança.
// Se você incluiu uma implementação de Símbolo personalizada, é possível procurar pela
// lista de portadores de símbolos para que seja desserializada.
// Nota: Qualquer objeto Java será desserializado automaticamente por
// 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();
// Transmite esses bytes no construtor da classe de
// implementação para desserialização.
com.acme.MyCustomTokenImpl myTokenImpl = new com.acme.MyCustomTokenImpl(myTokenBytes);
}
}
}
}
public boolean commit() throws LoginException
{
// (Para obter mais informações sobre o que fazer durante uma consolidação, consulte
// Desenvolvendo Módulos de Login Customizado para uma Configuração de Login do Sistema para JAAS.)
}
// Define as variáveis do módulo de login
com.ibm.wsspi.security.token.AuthorizationToken customAuthzToken = null;
com.ibm.wsspi.security.token.AuthenticationToken defaultAuthToken = null;
java.util.Map _sharedState = null;
}