Génération d'un jeton UsernameToken dynamique à l'aide d'un module de connexion JAAS empilé

Vous pouvez utiliser les API GenericSecurityTokenFactory pour créer des jetons de sécurité UsernameToken simples ou entièrement renseignés à utiliser par l'environnement d'exécution WS-Security. Ces jetons de sécurité peuvent être utilisés pour les WSSAPI, les modules de connexion JAAS ou le module UNTGenerateLoginModule, mais ils ne s'y limitent pas.

Pourquoi et quand exécuter cette tâche

GenericSecurityTokenFactory fournit plusieurs SPI pour créer des jetons UsernameTokens.509 pouvant être émis avec le module de connexion GenericIssuedTokenGenerateLoginModule.

Il existe deux types de jeton UsernameTokens :
Jeton UsernameToken complet
Un jeton UsernameToken complet contient du XML et peut être émis avec le module de connexion GenericSecurityTokenFactory.
Jeton UsernameToken simple
Un jeton UsernameToken simple ne contient qu'un nom d'utilisateur et un mot de passe ; il ne contient pas de XML. Les jetons UsernameToken simples permettent de définir un nom d'utilisateur et un mot de passe dynamiques pouvant être utilisés par les modules UNTGenerateLoginModule, LTPAGenerateLoginModule, et KRBGenerateLoginModule.

Lorsque vous créez un jeton UsernameToken complet en utilisant une API GenericSecurityTokenFactory, le jeton a la forme complète d'un jeton de sécurité qui peut être émis par l'exécution WS-Security. Déterminez le type de jeton à créer, puis exécutez des commandes, similaires à celles définies dans les étapes suivantes, pour créer le jeton. Une fois le jeton créé, le nom d'utilisateur et le mot de passe dans le jeton ne peuvent pas être modifiés.

Lorsque vous créez un jeton UsernameToken simple à l'aide d'une API GenericSecurityTokenFactory, ce jeton ne contient que le nom d'utilisateur et éventuellement le mot de passe. Un jeton UsernameToken simple ne contenant pas de XML, il ne peut pas être émis avec le module GenericIssuedTokenGenerateLoginModule.

Procédure

  1. Créez un jeton UsernameToken. Vous pouvez créer l'un des types suivants de jeton UsernameToken :
    • Un jeton UsernameToken complet avec un nom d'utilisateur et un mot de passe
    • Un jeton UsernameToken complet avec un nom d'utilisateur et un horodatage, mais pas de mot de passe
    • Un jeton UsernameToken simple avec un nom d'utilisateur et un mot de passe
    • Créez un jeton UsernameToken complet avec un nom d'utilisateur et un mot de passe.
      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());
    • Créez un jeton UsernameToken complet avec un nom d'utilisateur et un horodatage, mais sans mot de passe.
      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);
    • Créez un jeton UsernameToken simple avec un nom d'utilisateur et un mot de passe.
      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. Créez un module de connexion JAAS. Si vous avez créé un jeton UsernameToken complet à l'étape précédente, vous devez créer un module de connexion JAAS pouvant être empilé sur le module de connexion GenericIssuedTokenGenerateLoginModule pour émettre un jeton UsernameToken complet. Si vous avez créé un jeton UsernameToken simple à l'étape précédente, vous devez créer un module de connexion JAAS pouvant être empilé sur le module de connexion UNTGenerateLoginModule pour émettre un jeton UsernameToken dynamique.
    • Créez un module de connexion JAAS pouvant être empilé sur le module de connexion GenericIssuedTokenGenerateLoginModule pour émettre un jeton UsernameToken complet.
      L'exemple suivant s'applique si vous utilisez la version 8.5.0.2 ou une version ultérieure :
      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 {
          //A des fins de lisibilité, ce module de connexion ne fournit aucune
          //protection contre les NPE
      
          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");
          }
      
          //L'ID utilisateur et le mot de passe peuvent être obtenus comme vous le voulez
      
         //(Facultatif) Récupérez le nom d'utilisateur et le mot de passe configurés dans le gestionnaire de rappel
          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());
      	
          //Placer le jeton dans une liste d'état partagé où il sera accessible
          //aux modules de connexion empilés
          factory.putGeneratorTokenToSharedState(_sharedState, unt);
      
          return true;
        }
        //Implémentez le reste des méthodes requises par
        // l'interface LoginModule
      }
    • Créez un module de connexion JAAS pouvant être empilé sur le module UNTGenerateLoginModule pour émettre un jeton UsernameToken dynamique
      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 {
          //A des fins de lisibilité, ce module de connexion ne fournit aucune
          //protection contre les NPE
      
          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");
          }
      	
          //L'ID utilisateur et le mot de passe peuvent être obtenus comme vous le voulez
      
          //(Facultatif) Récupérez le nom d'utilisateur et le mot de passe configurés dans le gestionnaire de rappel
          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());
      
          //Placer le jeton dans une liste d'état partagé où il sera accessible
          //aux modules de connexion empilés
          factory.putGeneratorTokenToSharedState(_sharedState, unt);
      
          return true;
        }
        //Implémentez le reste des méthodes requises par
        // l'interface LoginModule
      }
  3. Créez une configuration de connexion JAAS.
    1. Notez le nom de classe complet du module de connexion personnalisé que vous avez créé à l'étape précédente. Par exemple, test.tokens.MyFullUntGenerator.
    2. Notez le nom de classe complet du module de connexion sur lequel vous empilez le module JAAS. Par exemple, com.ibm.ws.wssecurity.wssapi.token.impl.UNTGenerateLoginModule ou com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenGenerateLoginModule.
    3. Dans la console d'administration, accédez à Sécurité > Sécurité globale.
    4. Sous Authentification, accédez à Service d'authentification et d'autorisation Java > Connexions au système.
    5. Cliquez sur Nouveau et, sous Alias, entrez test.generate.unt.
    6. Sous Modules de connexion JAAS, cliquez sur Nouveau et, sous Nom de la classe du module, entrez le nom de votre module de connexion personnalisé. Sélectionnez Utiliser le proxy de module de connexion et cliquez sur OK.
    7. Cliquez sur Nouveau, et, sous Nom de la classe du module, entrez le nom du module de connexion sur lequel vous empilez le module JAAS. Cliquez sur OK.
  4. Configurez le générateur de jetons UsernameToken pour qu'il utilise la nouvelle configuration de connexion JAAS.
    1. Dans la console d'administration, ouvrez la configuration de liaisons à modifier.
    2. Sélectionnez WS-Security > Authentification et protection.
    3. Sous Jetons d'authentification, sélectionnez le jeton UsernameToken sortant à modifier.
    4. Sous Connexion JAAS, sélectionnez test.generate.unt.
    5. Facultatif : Si vous utilisez GenericIssuedTokenGenerateLoginModule, ajoutez la propriété personnalisée passThroughToken=true.
      1. Cliquez sur Gestionnaire d'appel.
      2. Ajoutez la propriété personnalisée passThroughToken=true.
      3. Cliquez sur OK.
  5. Cliquez sur Sauvegarder.
  6. Redémarrez le serveur d'applications pour appliquer les modifications à la configuration JAAS.
  7. Testez le service.

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_createusertokens
Nom du fichier : twbs_createusertokens.html