Gerando um UsernameToken Dinâmico Usando um Módulo de Login do JAAS Empilhado

É possível usar as APIs GenericSecurityTokenFactory para criar tokens de segurança UsernameToken simples ou totalmente preenchidos para serem usados pelo tempo de execução do WS-Security. Esses tokens de segurança podem ser usados para, mas não estão limitados a, os módulos de login WSSAPIs e JAAS ou UNTGenerateLoginModule.

Sobre Esta Tarefa

O GenericSecurityTokenFactory fornece várias APIs que podem ser usadas para criar UsernameTokens que podem ser emitidos com o GenericIssuedTokenGenerateLoginModule.

Há dois tipos de UsernameTokens:
UsernameToken completo
Um UsernameToken completo contém XML e pode ser emitido com o módulo de login GenericSecurityTokenFactory.
UsernameToken simples
Um UsernameToken simples contém apenas um nome de usuário e uma senha; não contém XML. UsernameTokens simples são usados para configurar um nome de usuário e uma senha dinâmicos que podem ser usados por UNTGenerateLoginModule, LTPAGenerateLoginModule e KRBGenerateLoginModule.

Quando um UsernameToken completo é criado com o uso de uma API GenericSecurityTokenFactory, o token é a forma completa de um token de segurança que pode ser emitido pelo tempo de execução do WS-Security. Determine o tipo de token que deseja criar e depois emita comandos semelhantes aos especificados em uma das etapas a seguir para criar seu token. Depois que o token for criado, o nome de usuário e a senha no token não poderão ser modificados.

Quando um UsernameToken simples for criado usando uma API GenericSecurityTokenFactory, o token conterá apenas o nome de usuário e, como opção, a senha. Como um UsernameToken simples não contém XML, ele não pode ser emitido com GenericIssuedTokenGenerateLoginModule.

Procedimento

  1. Crie um UsernameToken. É possível criar um dos tipos a seguir de UsernameToken:
    • Um UsernameToken integral com um nome de usuário e senha
    • Um UsernameToken integral com um nome de usuário e um registro de data e hora, mas nenhuma senha
    • Um UsernameToken simples com um nome de usuário e senha
    • Crie um UsernameToken integral com um nome de usuário e senha.
      import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
      
      ...
      
      GenericSecurityTokenFactory gstFactory = GenericSecurityTokenFactory.getInstance();
      UsernameToken myUnt = gstFactory.getFullUsernameToken("myUsername", "myPassword".toCharArray());
    • Crie um UsernameToken integral com um nome de usuário e registro de data e hora, mas sem senha.
      import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
      
      ...
      
      GenericSecurityTokenFactory gstFactory = GenericSecurityTokenFactory.getInstance();
      UsernameToken myUnt = gstFactory.getFullUsernameToken("myUsername", null, true);
    • Crie um UsernameToken simples com um nome de usuário e senha.
      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());
  2. Crie um módulo de login do JAAS. Se tiver criado um UsernameToken integral na etapa anterior, você deve criar um módulo de login do JAAS que pode ser empilhado na parte superior de GenericIssuedTokenGenerateLoginModule para emitir um UsernameToken integral. Se tiver criado um UsernameToken simples na etapa anterior, você deve criar um módulo de login do JAAS que pode ser empilhado na parte superior de UNTGenerateLoginModule para emitir um UsernameToken dinâmico.
    • Crie um módulo de login do JAAS que possa ser empilhado sobre GenericIssuedTokenGenerateLoginModule para emitir um UsernameToken completo.
      O exemplo a seguir se aplica se você estiver usando a Versão 8.5.0.2 ou posterior:
      package test.tokens;
      
      import java.util.HashMap;
      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.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.WSSUtilFactory;
      import com.ibm.wsspi.wssecurity.core.config.CallbackHandlerConfig;
      
      import java.util.ArrayList;
      
      public class MyFullUntGenerator implements LoginModule {
      
        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 {
          //For the sake of readability, this login module does not
          //protect against all NPE's
      
          GenericSecurityTokenFactory factory = null;
          try {
            factory = GenericSecurityTokenFactory.getInstance();
          } catch (Exception e) {
            throw new LoginException(e.toString());
          }
          if (factory == null) {
            throw new LoginException("GenericSecurityTokenFactory.getInstance() returned null");
          }
      
          //The userid and password can be obtained however you want
      
         // (Optional) Obtain the username and password configured in the callback handler
          Map wssContext = getWSSContext(_handler);            
          CallbackHandlerConfig chc = (CallbackHandlerConfig) wssContext.get(CallbackHandlerConfig.CONFIG_KEY);    
                                                           
          String username = chc.getUserId();                   
          char[] password = chc.getUserPassword();   
      
          UsernameToken unt = factory.getFullUsernameToken("myUsername", "myPassword".toCharArray());
      	
          //Put the token in a list on the shared state where it will be available to be used by
          //stacked login modules
          factory.putGeneratorTokenToSharedState(_sharedState, unt);
      
          return true;
        }
        //implementar o restante dos métodos requeridos pela
        //interface LoginModule
      }
    • Crie um módulo de login do JAAS que possa ser empilhado sobre UNTGenerateLoginModule para emitir um UsernameToken dinâmico.
      package test.tokens;
      
      import java.util.HashMap;
      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.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.WSSUtilFactory;
      import com.ibm.wsspi.wssecurity.core.config.CallbackHandlerConfig;
      
      import java.util.ArrayList;
      
      public class MySimpleUntGenerator implements LoginModule {
      
        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 {
          //For the sake of readability, this login module does not
          //protect against all NPE's
      
          GenericSecurityTokenFactory factory = null;
          try {
            factory = GenericSecurityTokenFactory.getInstance();
          } catch (Exception e) {
            throw new LoginException(e.toString());
          }
          if (factory == null) {
            throw new LoginException("GenericSecurityTokenFactory.getInstance() returned null");
          }
      	
          //The userid and password can be obtained however you want
      
          // (Optional) Obtain the username and password configured in the callback handler
          Map wssContext = getWSSContext(_handler);            
          CallbackHandlerConfig chc = (CallbackHandlerConfig) wssContext.get(CallbackHandlerConfig.CONFIG_KEY);    
                                                           
          String username = chc.getUserId();                   
          char[] password = chc.getUserPassword();   
      
          UsernameToken unt = factory.getSimpleUsernameToken("myUsername", "myPassword".toCharArray());
      
          //Put the token in a list on the shared state where it will be available to be used by
          //stacked login modules
          factory.putGeneratorTokenToSharedState(_sharedState, unt);
      
          return true;
        }
        //implementar o restante dos métodos requeridos pela
        //interface LoginModule
      }
  3. Crie uma configuração de login do JAAS.
    1. Observe o nome de classe integral do módulo de login customizado que você criou na etapa anterior. Por exemplo, test.tokens.MyFullUntGenerator.
    2. Observe o nome de classe integral do módulo de login no qual você está empilhando. Por exemplo, com.ibm.ws.wssecurity.wssapi.token.impl.UNTGenerateLoginModule ou com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenGenerateLoginModule.
    3. No console administrativo, acesse Segurança > Segurança Global.
    4. Sob Autenticação, acesse Java Authentication and Authorization Service > Logins no Sistema.
    5. Clique em Novo e em Alias insira test.generate.unt.
    6. Em módulos de login do JAAS, clique em Novo e em Nome de classe do módulo, insira o nome do módulo de login customizado. Selecione Usar Proxy do Módulo de Login e clique em OK.
    7. Clique em Novo e sob Nome da Classe do Módulo, insira o nome do módulo de login no qual está empilhando. Clique OK.
  4. Configure o gerador do token UsernameToken para usar a nova configuração de login do JAAS.
    1. No console administrativo, abra a configuração de ligação que deseja alterar.
    2. Selecione WS-Security > Autenticação e Proteção.
    3. Sob Tokens de Autenticação, selecione o UsernameToken de saída que deseja alterar.
    4. Em Login do JAAS, selecione test.generate.unt.
    5. Opcional: Se estiver usando GenericIssuedTokenGenerateLoginModule, inclua a propriedade customizada passThroughToken=true.
      1. Clique em Manipulador de Retorno de Chamada.
      2. Inclua a propriedade customizada passThroughToken=true.
      3. Clique OK.
  5. Clique em Salvar.
  6. Reinicie o servidor de aplicativos para aplicar as mudanças na configuração do JAAS.
  7. Teste o serviço.

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_createusertokens
Nome do arquivo: twbs_createusertokens.html