Código de amostra para estender o esquema entre diversos domínios de segurança

As etapas de configuração, comandos, código de amostra e gráficos de dados para estender o esquema de propriedade entre diversos domínios de segurança são fornecidos aqui.

As etapas a seguir são cobertas nos comandos de configuração e nos fragmentos de código de amostra:

  1. Crie diversos domínios de segurança.
  2. Mapeie os domínios de segurança para servidores de aplicativos específicos.
  3. Instale os aplicativos de sistema de pré-requisito.
  4. Inclua novas propriedades em cada instância do servidor.
  5. Execute operações de procura usando as propriedades estendidas em diferentes instâncias.

Pré-requisito

Assegure-se de ter lido as informações e concluído as etapas descritas no tópico, Pré-requisitos de Programação, incluindo a seção, Estendendo o Esquema de Propriedade, que tem informações sobre os objetos de dados propertySchema e extensionPropertySchema e lista a sintaxe válida para os tipos de dados de propriedade.

Você deve concluir as seguintes etapas de configuração antes de usar o código de amostra em seu aplicativo. Inicie a ferramenta wsadmin e execute os seguintes comandos. Substitua as variáveis pelos valores reais que você deseja usar.

  1. Crie um perfil de base usando a Ferramenta de Gerenciamento de Perfil do WebSphere Application Server. Verifique se a Segurança Admin está ativada. Um novo servidor de aplicativos é criado, por exemplo, server1.
  2. Inclua outro servidor, por exemplo, server2.
    $AdminTask createApplicationServer nodeName {-name server2}
  3. Crie um domínio de segurança.
    $AdminTask copySecurityDomainFromGlobalSecurity {-securityDomainName domain1}
  4. Mapeie esse domínio para o server2 criado na etapa 2.
    $AdminTask mapResourceToSecurityDomain { -securityDomainName domain1 -resourceName Cell=:Node=nodeName:Server=server2}
  5. Em um ambiente com diversos domínios de segurança, é possível configurar a propriedade useGlobalSchema para usar o esquema global em vez do esquema de domínio específico. Esquema global se refere ao esquema do domínio admin. Os domínios de aplicativo configurados para usar esquema global compartilham o mesmo esquema do domínio admin. Dessa forma, se você estender o esquema para um aplicativo em um domínio, deverá considerar como isso poderá afetar aplicativos de outros domínios também ligados pelo mesmo esquema. Por exemplo, a inclusão de uma propriedade obrigatória para um aplicativo pode fazer com que outros aplicativos falhem.

    Se você quiser usar o esquema global, execute esta etapa. Para usar o esquema de domínio específico, ignore esta etapa.

    $AdminTask setIdMgrUseGlobalSchemaForModel { -useGlobalSchema true -securityDomainName domain1 }
  6. Instale o wim.ear como um aplicativo de sistema no server1.
    $AdminApp install app_server_root/systemApps/wim.ear { -appname wim -server server1 -systemApp}
  7. Instale o wimperdomain.ear como um aplicativo normal no server2. Em um ambiente com vários domínios de segurança, você deve implementar o EJB do gerenciador de membro virtual em cada servidor de destino, onde o escopo do servidor esteja associado a esse domínio de segurança, para obter uma referência à instância do gerenciador de membro virtual nesse domínio. Este procedimento permite que você chame as APIs do gerenciador de membro virtual por meio do EJB para um domínio específico. Somente usuários com as funções de acesso obrigatórias para as APIs do gerenciador de membro virtual ou superusuários nesse domínio podem chamar as respectivas APIs.
    $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. Salve a configuração.
    $AdminConfig save

Código de Amostra

Inclua o seguinte código de amostra no código do aplicativo conforme descrito nas etapas a seguir. Substitua as variáveis pelos valores reais que você deseja usar.

  1. As seguintes declarações de variáveis são necessárias para usar os métodos nos fragmentos de código de amostra fornecidos nas próximas etapas. É possível incluir essas declarações no código do aplicativo e substituir as variáveis pelos valores reais que deseja usar.
    //O objeto de serviço que contém a referência de serviço ejb do gerenciador de membro virtual para server1.
    	private static Service service1 = null;
    	
    //O objeto de serviço que contém a referência de serviço ejb do gerenciador de membro virtual para server2.
    	private static Service service2 = null;
    
    //Uma constante de sequência para o novo nome da propriedade a ser incluído para server1.
    	private static final String server1PropName = "postOfficeBox";
    
    //Uma constante de sequência para o novo nome da propriedade a ser incluído para server2.
    	private static final String server2PropName = "age";
  2. Inicie server1 usando o comando startServer.
  3. Use o seguinte método locateServices() para localizar os serviços do gerenciador de membro virtual que estão sendo executados no WebSphere Application Server no host local. Assegure-se de que a porta de autoinicialização esteja corretamente especificada no método locateServices().
    /**
     *  Este método localiza os serviços do gerenciador de membro virtual em execução no 
     *  WebSphere Application Sever no host local
     */
    private static void locateServices()
    {
        // EJB do Serviço WIM de acesso 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. Use o seguinte método createPropertyOnServer1() para incluir uma nova propriedade na instância do server1.
    /**
     *  Este método inclui a propriedade "postOfficeBox" no tipo de entidade "PersonAccount".
     */
    private static void createPropertyOnServer1() 
    {
        try 
        {
            System.out.println("\nCriando novo tipo de propriedade postOfficeBox 
                    e incluindo-o no tipo de entidade existente PersonAccount");
            
            DataObject root = service1.createRootDataObject();
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            
            // Criar novo objeto de dados de esquema de propriedade
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Configurar os valores para a propriedade, por exemplo, URI do namespace, prefixo de namespace, nome da propriedade
            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("Gráfico de dados de entrada -> " + printDO(root));
            // Chamar a API de criação de esquema
            root = service1.createSchema(root);
            System.out.println("Output datagraph -> " + printDO(root));
            System.out.println("\nCLIENT: novo tipo de propriedade é criado.");
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    }
  5. Pare server1 usando o comando stopServer.
  6. Inicie o server2 usando o comando startServer.
  7. Use o seguinte método createPropertyOnServer2() para incluir uma nova propriedade na instância do server2.
    /**
     *  Este método inclui a propriedade "age" no tipo de entidade "PersonAccount".
     */
    private static void createPropertyOnServer2() 
    {
        try 
        {
            System.out.println("\nCriando novo tipo de propriedade age e 
                    incluindo-o no tipo de entidade existente Person");
            
            DataObject root = service2.createRootDataObject();
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            
            // Criar novo objeto de dados de esquema de propriedade
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Configurar os valores para a propriedade, por exemplo, URI do namespace, prefixo de namespace, nome da propriedade
            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("Gráfico de dados de entrada", root);
            System.out.println("Gráfico de dados de entrada -> " + printDO(root));
            // Chamar a API de criação de esquema
            root = service2.createSchema(root);
            System.out.println("Gráfico de dados de saída -> " + printDO(root));
            System.out.println("Novo tipo de propriedade é criado.");
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }		
    }
  8. Pare server2 usando o comando stopServer.
  9. Inicie server2 e server1.
  10. Crie entidades com as novas propriedades incluídas nas etapas 4 e 7. Para obter o código de amostra para incluir novas propriedades, consulte o tópico Código de Amostra para Estender o Esquema no Repositório de Arquivo.
  11. Use o seguinte método testSearchProperties() para executar operações de procura usando as propriedades estendidas em diferentes instâncias.
    /**
    	 *  Método que executa diferentes procuras em diferentes servidores.
    	 */
    private static void testSearchProperties() 
    {
        // Procurar usando a propriedade server1, mas usando service1
        System.out.println("Searching property '" + server1PropName + "' on server1");
        searchserver1PropName(service1);
        
        // Parada do utilitário para sincronizar saída
        pause();
        
        // Procurar usando a propriedade server1, mas usando service2
        System.out.println("Searching property '" + server1PropName + "' on server2");
        searchserver1PropName(service2);
        
        // Parada do utilitário para sincronizar saída
        pause();
        
        // Procurar usando a propriedade server2, mas usando service2
        System.out.println("Searching property '" + server2PropName + "' on server2");
        searchserver2PropName(service2);
        
        // Parada do utilitário para sincronizar saída
        pause();
        
        // Procurar usando a propriedade server2, mas usando service1
        System.out.println("Searching property '" + server2PropName + "' on server1");
        searchserver2PropName(service1);
    }
    
    /**
     *  Um método utilitário incluído para assegurar-se de que a exceção seja liberada para o console 
     *  antes de iniciar com a próxima operação.
     */
    private static void pause() 
    {
        try 
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) 
        {
        }
    }
    
    /**
     * Método para procurar em 'age'
     * @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver2PropName(Service service) 
    {
        try 
        {
            //Procurar
            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 procurar em 'postOfficeBox'
     *  @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver1PropName(Service service) 
    {
        try 
        {
            //Procurar
            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

Se a propriedade useGlobalSchema for configurada para usar o esquema global conforme descrito na etapa 5 da seção Pré-requisitos, todas as propriedades estendidas em todas as instâncias podem ser usadas ao executar operações de procura nos domínios. Se você não configurar useGlobalSchema, somente o esquema de domínio específico será estendido e as operações de procura serão baseadas apenas nas propriedades estendidas na instância atual.



Termos de uso | Feedback