É possível passar dinamicamente um nome de usuário e uma senha para o gerador de token LTPA, LTPAGenerateLoginModule, durante o uso de SPIs WSS.
No entanto, se você tiver que usar conjuntos de políticas e ligações, não será possível fazer isso em uma configuração padrão, pois o manipulador de retorno de chamada e o nome de usuário e a senha no manipulador de retorno de chamada são valores fixos.
É possível usar conjuntos de políticas e ligações para criar tokens do Kerberos dinâmicos se um módulo de login do JAAS customizado for usado.
Antes de Iniciar
Se você criar um módulo de login do JAAS customizado, ou incluir um UsernameToken no contexto da solicitação do cliente, será possível customizar o nome de usuário e a senha que o gerador de token LTPA usa ao criar um token LTPA. Também é possível customizar o token configurando diretamente os bytes de token usados pelo gerador de token LTPA. A configuração dos bytes de token é útil quando um desenvolvedor de aplicativos deseja escrever código para obter o token LTPA do cabeçalho de HTTP de uma solicitação de entrada e colocá-lo no cabeçalho de Segurança de uma mensagem SOAP de saída.
Sobre Esta Tarefa
O GenericSecurityTokenFactory fornece SPIs que você pode usar para criar um token que o LTPAGenerateLoginModule pode usar para customizar o token LTPA gerado por esse módulo. Essas SPIs permitem usar senhas e nomes de usuários dinâmicos ou configurar diretamente os
bytes de token, que são recursos não fornecidos pelo manipulador de retorno de chamada.
O procedimento a seguir mostra como usar o método do módulo de login do JAAS empilhado para customizar o nome de usuário e a senha ou os bytes de token. Após a conclusão desse procedimento, também é possível colocar o token recém-criado no contexto da solicitação do cliente. Para obter mais informações sobre como colocar um token no contexto da solicitação do cliente, consulte as constantes a seguir no Javadoc com.ibm.wsspi.wssecurity.core.Constants:
- com.ibm.wsspi.wssecurity.token.tokenHolder
- com.ibm.wsspi.wssecurity.token.enableCaptureTokenContext
Procedimento
- Crie o token dinâmico.
Conclua uma das subetapas a seguir.
- Para customizar o nome de usuário e a senha, crie um UsernameToken simples.
import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
...
GenericSecurityTokenFactory gstFactory = GenericSecurityTokenFactory.getInstance();
UsernameToken myUnt = gstFactory.getSimpleUsernameToken("myUsername", "myPassword".toCharArray());
- Para customizar os bytes de token, crie um BinarySecurityToken simples.
import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
import com.ibm.websphere.wssecurity.wssapi.token.BinarySecurityToken;
import com.ibm.websphere.wssecurity.wssapi.WSSUtilFactory;
...
GenericSecurityTokenFactory gstFactory = GenericSecurityTokenFactory.getInstance();
WSSUtilFactory utilFactory = WSSUtilFactory.getInstance();
//callbackHandler é obtido do método initialize no Módulo de Login
Map reqHeaders = utilFactory.getHTTPRequestHeaders(callbackHandler);
//getLtpaHeaderBytes é um método gravado por você para localizar o cabeçalho que
//tem o token LTPA em sua lista de cabeçalhos e retornar os
//bytes codificados do cabeçalho.
String encodedBytes = getLtpaHeaderBytes(reqHeaders);
byte [] decodedBytes = utilFactory.decode(encodedBytes);
BinarySecurityToken bst = factory.getSimpleBinarySecurityToken(com.ibm.websphere.wssecurity.wssapi.token.LTPAv2Token, decodedBytes);
- Crie um módulo de login do JAAS.
package test.tokens;
import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
import com.ibm.websphere.wssecurity.wssapi.token.BinarySecurityToken;
public class MyUntCustomLoginModule implements LoginModule {
//For the sake of readability, this login module does not
//protect against all NPE's
private Map _sharedState;
private Map _options;
private CallbackHandler _handler;
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map<String, ?> sharedState, Map<String, ?> options) {
this._handler = callbackHandler;
this._sharedState = sharedState;
this._options = options;
}
public boolean login() throws LoginException {
GenericSecurityTokenFactory factory = null;
try {
factory = GenericSecurityTokenFactory.getInstance();
} catch (Exception e) {
throw new LoginException(e.toString());
}
//código para criar BinarySecurityToken pode ser usado
//aqui no lugar do UsernameToken simples
UsernameToken unt = factory.getSimpleUsernameToken("myUsername", "myPassword".toCharArray());
factory.putGeneratorTokenToSharedState(this._sharedState, unt);
return true;
}
//implementar o restante dos métodos requeridos pela
//interface LoginModule
}
- Crie uma nova configuração de login do JAAS.
- No console administrativo, selecione Segurança->Segurança global.
- Em Autenticação, selecione Java Authentication
and Authorization Service.
- Selecione Logins do sistema.
- Crie o gerador com o módulo customizado primeiro.
- Clique em Novo e especifique Alias
= test.generate.ltpa.
- Clique em Novo e especifique Nome de classe de
módulo = test.tokens.MyUntCustomLoginModule.
- Selecione Usar proxy do módulo de login.
- Clique em OK.
- Clique em Novo e selecione com.ibm.ws.wssecurity.wssapi.token.impl.LTPAGenerateLoginModule.
- Clique em OK.
- Clique em JAAS - Logins do sistema.
- Configure o gerador de token LTPA para usar a nova configuração de JAAS.
- Abra a configuração de ligações que deseja alterar.
No console administrativo, selecione WS-Security > Autenticação e proteção.
- Em Tokens de Autenticação, selecione o token LTPA de saída que deseja alterar.
- Selecione Login do JAAS = test.generate.ltpa.
- Clique em Salvar.
- Reinicie o servidor de aplicativos para aplicar as mudanças na configuração do JAAS.
- Teste o serviço.