Código de ejemplo para extender un esquema a través dominios de seguridad múltiple

Aquí se proporcionan los pasos de configuración, los mandatos, el código de ejemplo y gráficos de datos para extender un esquema de propiedad a través de dominios de seguridad múltiple.

En los mandatos de configuración y los fragmentos de código de ejemplo se incluyen los pasos siguientes:

  1. Crear dominios de seguridad múltiple.
  2. Correlacionar los dominios de seguridad con servidores de aplicaciones específicos.
  3. Instalar las aplicaciones del sistema requisito previo.
  4. Añadir nuevas propiedades a cada instancia de servidor.
  5. Realizar operaciones de búsqueda usando propiedades extendidas en diferentes instancias.

Requisitos previos

Asegúrese de leer la información y completar los pasos que se describen en el tema Requisitos previos de programación, incluida la sección Ampliación del esquema de propiedad, que contiene información sobre los objetos de datos propertySchema y extensionPropertySchema e indica la sintaxis válida para los tipos de datos de propiedad.

Debe realizar los siguientes pasos de configuración para poder utilizar el código de ejemplo en la aplicación. Inicie la herramienta wsadmin y ejecute los mandatos siguientes. Sustituya las variables por los valores reales que desea utilizar.

  1. Cree un perfil base usando la herramienta de gestión de perfiles de WebSphere Application Server. Asegúrese de que esté habilitada la Seguridad Admin. Se crea un nuevo servidor de aplicaciones, por ejemplo, server1.
  2. Añada otro servidor, por ejemplo, server2.
    $AdminTask createApplicationServer nodeName {-name server2}
  3. Cree un dominio de seguridad.
    $AdminTask copySecurityDomainFromGlobalSecurity {-securityDomainName domain1}
  4. Correlacione este dominio con el server2 creado en el paso 2.
    $AdminTask mapResourceToSecurityDomain { -securityDomainName domain1 -resourceName Cell=:Node=nodeName:Server=server2}
  5. En un entorno de dominio de seguridad múltiple, puede establecer la propiedad useGlobalSchema para utilizar el esquema global en lugar del esquema específico del dominio. El esquema global hace referencia al esquema del dominio admin. Los dominios de aplicación establecidos para utilizar el esquema global comparten el mismo esquema del dominio admin. Por ello, si amplía el esquema para una aplicación en un dominio, debe tener en cuenta cómo esto puede afectar a las aplicaciones de otros dominios ya que también están enlazadas mediante el mismo esquema. Por ejemplo, el hecho de añadir una propiedad obligatoria para una aplicación podría hacer que fallaran otras aplicaciones.

    Si desea utilizar el esquema global, realice este paso. Si desea utilizar el esquema específico del dominio, omita este paso.

    $AdminTask setIdMgrUseGlobalSchemaForModel { -useGlobalSchema true -securityDomainName domain1 }
  6. Instale wim.ear como aplicación del sistema en server1.
    $AdminApp install app_server_root/systemApps/wim.ear { -appname wim -server server1 -systemApp}
  7. Instale wimperdomain.ear como una aplicación normal en server2. En un entorno de dominio de seguridad múltiple, debe desplegar el EJB de virtual member manager en cada servidor de destino, donde el ámbito de servidor está asociado con el dominio de seguridad, para obtener una referencia a la instancia de virtual member manager en ese dominio. Este procedimiento le permite invocar las API de virtual member manager mediante EJB para un dominio específico. Tan solo los usuarios con los roles de acceso necesarios para las API de virtual member manager o los superusuarios de dicho dominio pueden invocar las API correspondientes.
    $AdminApp install app_server_root/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. Guarde la configuración.
    $AdminConfig save

Código de ejemplo

Añada el código de ejemplo siguiente al código de aplicación como se describe en los pasos siguientes. Sustituya las variables por los valores reales que desea utilizar.

  1. Las siguientes declaraciones de variables son necesarias para utilizar los métodos en el fragmento de código de ejemplo que se proporciona en los pasos siguientes. Puede añadir estas declaraciones al código de aplicación y sustituir las variables por los valores reales que desea utilizar.
    //El objeto de servicio que contiene la referencia de servicio ejb de virtual member manager para server1.
    	private static Service service1 = null;
    	
    //El objeto de servicio que contiene la referencia de servicio ejb de virtual member manager para server2.
    	private static Service service2 = null;
    
    //Una constante de tipo serie para el nuevo nombre de propiedad que debe añadirse para server1.
    	private static final String server1PropName = "postOfficeBox";
    
    //Una constante de tipo serie para el nuevo nombre de propiedad que debe añadirse para server2.
    	private static final String server2PropName = "age";
  2. Inicie server1 utilizando el mandato startServer.
  3. Utilice el método locateServices() para localizar los servicios de virtual member manager que se ejecutan en WebSphere Application Server en el host local. Asegúrese de que el puerto de arranque se especifique correctamente en el método locateServices().
    /**
     *  Este método localiza los servicios de virtual member manager que se ejecutan en
     *  WebSphere Application Sever en el host local
     */
    private static void locateServices()
    {
        // EJB de servicio de WIM de acceso remoto
        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. Utilice el método createPropertyOnServer1() siguiente para añadir una nueva propiedad a la instancia server1.
    /**
     *  Este método añade la propiedad "postOfficeBox" al tipo de entidad "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);
            
            // Crear un objeto de datos de esquema de propiedad nuevo
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Establecer valores para la propiedad, por ej., URI espacio_nombres, prefijo espacio_nombres, nombre_propiedad
            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));
            // Invocar la API de creación de esquema
            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. Detenga server1 utilizando el mandato stopServer.
  6. Inicie server2 utilizando el mandato startServer.
  7. Utilice el método createPropertyOnServer2() siguiente para añadir una nueva propiedad a la instancia server2.
    /**
     *  Este método añade la propiedad "age" al tipo de entidad "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);
            
            // Crear un objeto de datos de esquema de propiedad nuevo
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Establecer valores para la propiedad, por ej., URI espacio_nombres, prefijo espacio_nombres, nombre_propiedad
            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));
            // Invocar la API de creación de esquema
            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. Detenga server2 utilizando el mandato stopServer.
  9. Inicie server2 y server1.
  10. Cree entidades con las nuevas propiedades añadidas en los pasos 4 y 7. Para el código de ejemplo para añadir nuevas propiedades, consulte el tema Código de ejemplo para extender un esquema en el depósito de archivos.
  11. Utilice el método testSearchProperties() siguiente para realizar operaciones de búsqueda usando propiedades extendidas en diferentes instancias.
    /**
    	 *  Método que ejecuta búsquedas diferentes en servidores diferentes.
    	 */
    private static void testSearchProperties() 
    {
        // Buscar usando la propiedad server1 y usando service1
        System.out.println("Searching property '" + server1PropName + "' on server1");
        searchserver1PropName(service1);
        
        // Detención de programa de utilidad para sincronizar la salida
        pause();
        
        // Buscar usando la propiedad server1 y usando service2
        System.out.println("Searching property '" + server1PropName + "' on server2");
        searchserver1PropName(service2);
        
        // Detención de programa de utilidad para sincronizar la salida
        pause();
        
        // Buscar usando la propiedad server2 y usando service2
        System.out.println("Searching property '" + server2PropName + "' on server2");
        searchserver2PropName(service2);
        
        // Detención de programa de utilidad para sincronizar la salida
        pause();
        
        // Buscar usando la propiedad server2 y usando service1
        System.out.println("Searching property '" + server2PropName + "' on server1");
        searchserver2PropName(service1);
    }
    
    /**
     *  Método de programa de utilidad para asegurar que la excepción se desecha en la consola
     *  antes de iniciar la operación siguiente.
     */
    private static void pause() 
    {
        try
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) 
        {
        }
    }
    
    /**
     * Método para buscar en 'age'
     * @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver2PropName(Service service) 
    {
        try
        {
            //Buscar
            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étodo para buscar en 'postOfficeBox'
     *  @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver1PropName(Service service) 
    {
        try
        {
            //Buscar
            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();
        }
    }

Resultados

Si ha establecido la propiedad useGlobalSchema para utilizar el esquema global como se describe en el paso 5 de la sección de requisitos previos, se pueden utilizar todas las propiedades extendidas en todas las instancias al realizar operaciones de búsqueda en varios dominios. Si no establece useGlobalSchema, sólo se extiende el esquema específico del dominio y las operaciones de búsqueda sólo se basan en las propiedades extendidas en la instancia actual.



Condiciones de uso | Comentarios