Exemple de code pour l'extension du schéma dans plusieurs domaines de sécurité

Les étapes de configuration, les commandes, les exemples de code et les graphiques de données permettant d'étendre le schéma des propriétés sur plusieurs domaines de sécurité sont fournis ici.

Les étapes suivantes sont décrites dans les commandes de configuration et les exemples de fragment de code :

  1. Création de plusieurs domaines de sécurité.
  2. Mappage des domaines de sécurité à des serveurs d'applications spécifiques.
  3. Installation des applications système prérequises.
  4. Ajout de nouvelles propriétés à chaque instance de serveur.
  5. Opérations de recherche à l'aide des propriétés étendues sur des instances différentes.

Conditions prérequises

Assurez-vous d'avoir bien lu les informations et effectué les étapes décrites dans la rubrique Prérequis pour la programmation et notamment dans la section Schéma de propriété étendu, qui contient des informations sur les objets de données propertySchema et extensionPropertySchema et indique la syntaxe valide pour les types de données de propriété.

Vous devez effectuer les étapes de configuration ci-après avant d'utiliser l'exemple de code dans votre application. Démarrez l'outil wsadmin et exécutez les commandes ci-après. Remplacez les variables par les valeurs actuelles à utiliser.

  1. Créez un profil de base à l'aide de l'outil de gestion des profils de WebSphere Application Server. Assurez-vous que la sécurité d'administration est activée. Un serveur d'applications est créé (par exemple, server1).
  2. Ajoutez un autre serveur (par exemple, server2).
    $AdminTask createApplicationServer nodeName {-name server2}
  3. Créez un domaine de sécurité.
    $AdminTask copySecurityDomainFromGlobalSecurity {-securityDomainName domain1}
  4. Mappez ce domaine au serveur server2 créé à l'étape 2.
    $AdminTask mapResourceToSecurityDomain { -securityDomainName domain1 -resourceName Cell=:Node=nodeName:Server=server2}
  5. Dans un environnement à plusieurs domaines de sécurité, vous pouvez définir la propriété useGlobalSchema pour utiliser le schéma global au lieu du schéma spécifique au domaine. Le schéma global fait référence au schéma du domaine admin. Les domaines d'application qui sont définis pour utiliser le schéma global partagent le même schéma du domaine admin. Ainsi, si vous étendez le schéma d'une application dans un domaine, vous devez étudier comment cela peut avoir une incidence sur les applications d'autres domaines car elles sont également liées par le même schéma. Par exemple, l'ajout d'une propriété obligatoire à une application peut entraîner l'échec des autres applications.

    Si vous souhaitez utiliser le schéma global, effectuez cette étape. Si vous voulez utiliser le schéma spécifique au domaine, ignorez cette étape.

    $AdminTask setIdMgrUseGlobalSchemaForModel { -useGlobalSchema true -securityDomainName domain1 }
  6. Installez wim.ear comme application système sur server1.
    $AdminApp install racine_serveur_app/systemApps/wim.ear { -appname wim -server server1 -systemApp}
  7. Installez wimperdomain.ear comme application normale sur server2. Dans un environnement à plusieurs domaines de sécurité, vous devez déployer l'EJB de virtual member manager sur chaque serveur cible, où la portée du serveur est associé à ce domaine de sécurité, afin d'obtenir une référence à l'instance de virtual member manager dans ce domaine. Cette procédure permet d'appeler les API de virtual member manager via l'EJB pour un domaine spécifique. Seuls les utilisateurs possédant les rôles d'accès requis pour les API de virtual member manager ou les superutilisateurs dans ce domaine peuvent appeler les API correspondantes.
    $AdminApp install racine_serveur_appt/installableApps/wimperdomain.ear {
      			-appname wimperdomain1 
      			-BindJndiForEJBNonMessageBinding {{ wim.ejb WIMService wimejb.jar,
              META-INF/ejb-jar.xml ejbd1/com/ibm/websphere/wim/ejb/WIMServiceHome}} 
      			-MapModulesToServers {{ wim.ejb wimejb.jar,META-INF/ejb-jar.xml 
              WebSphere:cell=cellName,node=nodeName,server=server2 }}}
  8. Sauvegardez la configuration.
    $AdminConfig save

Exemple de code

Ajoutez l'exemple de code ci-après à votre code d'application, comme indiqué dans les étapes ci-après. Remplacez les variables par les valeurs actuelles à utiliser.

  1. Les déclarations de variable ci-après sont requises pour l'utilisation des méthodes dans les exemples de fragment de code donnés dans les étapes qui suivent. Vous pouvez ajouter ces déclarations à votre code d'application, puis remplacez les variables par les valeurs réelles à utiliser.
    //Objet de service qui contient la référence de service ejb de virtual member manager pour server1.
    	private static Service service1 = null;
    	
    //Objet de service qui contient la référence de service ejb de virtual member manager pour server2.
    	private static Service service2 = null;
    
    //Constante de type chaîne pour le nouveau nom de propriété à ajouter pour server1.
    	private static final String server1PropName = "postOfficeBox";
    
    //Constante de type chaîne pour le nouveau nom de propriété à ajouter pour server2.
    	private static final String server2PropName = "age";
  2. Démarrez server1 à l'aide de la commande startServer.
  3. Utilisez la méthode locateServices() ci-après pour localiser les services virtual member manager exécutés dans WebSphere Application Server sur l'hôte local. Assurez-vous que le port d'amorçage est correctement spécifié dans la méthode locateServices().
    /**
     *  Cette méthode localise les services virtual member manager exécutés dans 
     *  WebSphere Application Sever sur le système hôte local
     */
    private static void locateServices()
    {
        // Accès à distance à l'EJB de service WIM
        try 
        {
            Hashtable<String, String> environment = new Hashtable<String, String>();
            environment.put(LocalServiceProvider.PROVIDER_URL, "corbaloc:iiop:localhost:2814");
            
            service1 = new LocalServiceProvider(environment);
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    
        try 
        {
            Hashtable<String, String> environment = new Hashtable<String, String>();
            environment.put(LocalServiceProvider.EJB_JNDI_NAME, 
                    "ejbd1/com/ibm/websphere/wim/ejb/WIMServiceHome");
            environment.put(LocalServiceProvider.PROVIDER_URL, "corbaloc:iiop:localhost:2815");
            
            service2 = new LocalServiceProvider(environment);
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    }
  4. Utilisez la méthode createPropertyOnServer1() ci-après pour ajouter une nouvelle propriété à l'instance server1.
    /**
     *  Cette méthode ajoute la propriété "postOfficeBox" au type d'entité "PersonAccount".
     */
    private static void createPropertyOnServer1() 
    {
        try 
        {
            System.out.println("\nCreating new property type postOfficeBox 
                    and add it to existing entity type PersonAccount");
            
            DataObject root = service1.createRootDataObject();
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            
            // Création d'un objet de données de schéma de propriété
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Définition des valeurs de la propriété (par exemple, URI d'espace de nom, préfixe d'espace de nom, nom de la propriété)
            propSchemaDO.set(SchemaConstants.PROP_NS_URI, SchemaConstants.WIM_NS_URI);
            propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, server1PropName);
            propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
            propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_STRING);
            List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
            applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
            
            System.out.println("Input datagraph -> " + printDO(root));
            // Appel de l'API de création de schéma
            root = service1.createSchema(root);
            System.out.println("Output datagraph -> " + printDO(root));
            System.out.println("\nCLIENT: new property type is created.");
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    }
  5. Arrêtez server1 à l'aide de la commande stopServer.
  6. Démarrez server2 à l'aide de la commande startServer.
  7. Utilisez la méthode createPropertyOnServer2() ci-après pour ajouter une nouvelle propriété à l'instance server2.
    /**
     *  Cette méthode ajoute la propriété "age" au type d'entité "PersonAccount".
     */
    private static void createPropertyOnServer2() 
    {
        try 
        {
            System.out.println("\nCreating new property type age and 
                    add it to existing entity type Person");
            
            DataObject root = service2.createRootDataObject();
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            
            // Création d'un objet de données de schéma de propriété
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Définition des valeurs de la propriété (par exemple, URI d'espace de nom, préfixe d'espace de nom, nom de la propriété)
            propSchemaDO.set(SchemaConstants.PROP_NS_URI, SchemaConstants.WIM_NS_URI);
            propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, server2PropName);
            propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
            propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_INT);
            List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
            applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
            
            SDOUtils.printDataGraph("Input datagraph", root);
            System.out.println("Input datagraph -> " + printDO(root));
            // Appel de l'API de création de schéma
            root = service2.createSchema(root);
            System.out.println("Output datagraph -> " + printDO(root));
            System.out.println("New property type is created.");
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }		
    }
  8. Arrêtez server2 à l'aide de la commande stopServer.
  9. Démarrez server2 et server1.
  10. Créez des entités avec les nouvelles propriétés ajoutées aux étapes 4 et 7. Pour un exemple de code permettant d'ajouter de nouvelles propriétés, voir la rubrique Exemple de code pour l'extension du schéma dans le référentiel de fichiers.
  11. Utilisez la méthode testSearchProperties() ci-après pour effectuer des opérations de recherche à l'aide des propriétés étendues sur des instances différentes.
    /**
    	 *  Méthode qui exécute des recherches différentes sur des serveurs différents.
    	 */
    private static void testSearchProperties() 
    {
        // Recherche à l'aide de la propriété server1 mais en utilisant service1
        System.out.println("Searching property '" + server1PropName + "' on server1");
        searchserver1PropName(service1);
        
        // Arrêt de l'utilitaire pour synchroniser la sortie
        pause();
        
        // Recherche à l'aide de la propriété server1 mais en utilisant service2
        System.out.println("Searching property '" + server1PropName + "' on server2");
        searchserver1PropName(service2);
        
        // Arrêt de l'utilitaire pour synchroniser la sortie
        pause();
        
        // Recherche à l'aide de la propriété server2 mais en utilisant service2
        System.out.println("Searching property '" + server2PropName + "' on server2");
        searchserver2PropName(service2);
        
        // Arrêt de l'utilitaire pour synchroniser la sortie
        pause();
        
        // Recherche à l'aide de la propriété server2 mais en utilisant service1
        System.out.println("Searching property '" + server2PropName + "' on server1");
        searchserver2PropName(service1);
    }
    
    /**
     *  Méthode d'utilitaire ajoutée pour que l'exception soit vidée dans la console 
     *  avant le début de l'opération suivante.
     */
    private static void pause() 
    {
        try 
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) 
        {
        }
    }
    
    /**
     * Méthode de recherche sur 'age'
     * @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver2PropName(Service service) 
    {
        try 
        {
            //Search
            DataObject root = SDOHelper.createRootDataObject();
            DataObject searchCtrl = SDOHelper.createControlDataObject(root, null, 
                    SchemaConstants.DO_SEARCH_CONTROL);
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn"); 
            searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, 
                    "@xsi:type='PersonAccount' and " + server2PropName + " > 4");
            root = service.search(root);
            System.out.println("Output datagraph -> " + printDO(root));
            List searchResults = root.getList(SchemaConstants.DO_ENTITIES);
            for (int i = 0; i < searchResults.size(); i++) {
                DataObject ent = (DataObject) searchResults.get(i);
                DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
                if (id != null) {
                    String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
                    if (uniqueName != null) {
                        System.out.println("Found -> " + ent.getString("cn") + "(" + uniqueName + ")");
                    }
                }
            }
        } 
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    	}
    
    /**
     * Méthode de recherche sur 'postOfficeBox'
     *  @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver1PropName(Service service) 
    {
        try 
        {
            //Search
            DataObject root = SDOHelper.createRootDataObject();
            DataObject searchCtrl = SDOHelper.createControlDataObject(root, null, 
                    SchemaConstants.DO_SEARCH_CONTROL);
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn"); 
            searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, 
                    "@xsi:type='PersonAccount' and " + server1PropName + "='4-23'");
            root = service.search(root);
            System.out.println("Output datagraph -> " + printDO(root));
            List searchResults = root.getList(SchemaConstants.DO_ENTITIES);
            for (int i = 0; i < searchResults.size(); i++) {
                DataObject ent = (DataObject) searchResults.get(i);
                DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
                if (id != null) {
                    String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
                    if (uniqueName != null) {
                        System.out.println("Found -> " + ent.getString("cn") + "(" + uniqueName + ")");
                    }
                }
            }
        } 
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    }

Résultats

Si vous définissez la propriété useGlobalSchema de sorte qu'elle utilise le schéma global comme décrit à l'étape 5 de la section Configuration requise, toutes les propriétés étendues sur toutes les instances peuvent être utilisées lors d'opérations de recherche entre les domaines. Si vous ne définissez pas la propriété useGlobalSchema, seul le schéma spécifique au domaine est étendu et les opérations de recherche ne sont basées que sur les propriétés étendues dans l'instance actuelle.



Conditions d'utilisation | Commentaires