Como lidar com campos não mapeados

  • Versão de lançamento: Yokohama
  • Atualizado 30 de jan. de 2025
  • 3 min. de leitura
  • Você pode lidar com campos não mapeados na personalização do SCIM de maneiras diferentes.

    Durante a personalização do SCIM, os campos que não fazem parte das tabelas sys_user e sys_user_group podem ser mapeados executando as funções a seguir.

    Personalizar SCIM (criar ou atualizar)

    Você pode criar ou atualizar o Cliente de SCIM.

    • O administrador do SCIM pode adicionar scripts personalizados nos scripts onBefore e onAfter para campos que não estão mapeados na definição de ETL ou no RTE.
    • O administrador do SCIM pode substituir mapeamentos de RTE adicionando scripts personalizados nos scripts onBefore e onAfter.
    • Você pode invocar uma API passível de script nos scripts de RTE onBefore ou onAfter para acessar a solicitação de entrada e executar transformações em outras tabelas, listas e atributos não mapeados.
    • Você pode usar o método sn_auth.SCIM2Util.getScimProviderCustomizationContext() para fornecer o contexto de solicitação SCIM que contém o objeto scimResource. O scimResource no contexto representa o seguinte em cada operação:
      • POST: o recurso do SCIM enviado na carga da solicitação.
      • PUT: o recurso do SCIM atual do banco de dados substituído pelo recurso do SCIM enviado na carga da solicitação.
      • PATCH: o recurso do SCIM atual do banco de dados depois de executar as operações de patch.
    A seguir está um exemplo de um script onAfter.
    (function onAfter(source, target, importLog) {
    
        var ctx = sn_auth.SCIM2Util.getScimProviderCustomizationContext();
        gs.info("scim context ee: " + JSON.stringify(ctx.scimResource));
    
        var roles = ctx.scimResource.roles;
        if(roles) {
            var removingRolesGR = new GlideRecord("sys_user_has_role");
            removingRolesGR.addQuery("user", target.sys_user[0].sys_id);
            removingRolesGR.query();
            removingRolesGR.deleteMultiple();
    
        for (var i = 0; i < roles.length; i++) {
            var addingRolesGR = new GlideRecord("sys_user_has_role");
            addingRolesGR.setValue("user", target.sys_user[0].sys_id);
            addingRolesGR.setValue("role", roles[i].value);
            addingRolesGR.setValue("state", "active");
            addingRolesGR.insert();
            }
            }
            var customUserExtn = new global.SCIMProviderCustomization().getCustomExtensionUrn('User');
            var salary = ctx.scimResource[customUserExtn].salary;
            if (salary) {
                var gr = new GlideRecord("u_user_salary");
                gr.addQuery("user", target.sys_user[0].sys_id);
                gr.query();
                if (gr.next()) {
                    gr.setValue("salary", salary);
                    gs.info("scim update: " + gr.update());
                } else {
                gr.setValue("salary", salary);
                gr.setValue("user", target.sys_user[0].sys_id);
                gr.insert();
                }
               }
    
    })(source, target, importLog);

    Personalizar a resposta do SCIM

    Para as chamadas de API GET, qualquer resposta de retorno para o cliente de SCIM pode ser personalizada usando o script, estendendo o script SCIMProviderCustomization.

    Ao estender o script, o autor pode substituir os métodos customizeUserResponse e customizeGroupResponse para modificar as respostas dos recursos de Usuário e Grupo.

    A propriedade com.snc.integration.scim2.provider.customization.script.id permite que o plug-in SCIM use o script que deve ser usado para personalização de resposta.

    Veja a seguir um exemplo de extensão do script base.
    var SCIMCustomizationScript = Class.create();
    SCIMCustomizationScript.prototype = Object.extendsObject(SCIMProviderCustomization, {
        initialize: function() {
            SCIMProviderCustomization.prototype.initialize.call(this);
        },
        customizeUserResponse: function(context) {
            try {
                var rolesGR = new GlideRecord("sys_user_has_role");
                rolesGR.addQuery("user", context.scimResource.id);
                rolesGR.query();
                var i = 0;
                context.scimResource.roles = [];
                while (rolesGR.next()) {
                    context.scimResource.roles[i] = {
                        display: rolesGR.getElement('role.name').getValue(),
                        value: rolesGR.getElement('role.sys_id').getValue()
                    };
                    i++;
                }
                var userGR = new GlideRecord("u_user_salary");
                userGR.addQuery("user", context.scimResource.id);
                userGR.query();
                if (userGR.next()) {
                    var salary = userGR.getValue("salary");
                    if (salary) {
                        var customExtensionValue = SCIMProviderCustomization.prototype.getCustomExtensionNodeValue.call(this, "User", context);
                        customExtensionValue.salary = salary;
                        SCIMProviderCustomization.prototype.setCustomExtensionNodeValue.call(this, "User", context, customExtensionValue);
                    }
                }
            } catch (ex) {
                gs.error("err: " + ex);
            }
            return context;
        },
        customizeGroupResponse: function(context) {
            return context;
        },
        type: 'SCIMCustomizationScript'
    });
    Nota:
    • O parâmetro que os métodos customizeUserResponse e customizeGroupResponse contêm é um objeto de contexto com um atributo chamado scimResource. Este atributo tem todos os atributos de um objeto de recurso de usuário ou grupo.
    • Uma inclusão de script personalizada só pode ser criada e exibida pelo administrador.
    • Se um recurso de usuário ou grupo for modificado, você deverá retornar o contexto.
    • Se não houver modificação de qualquer atributo no objeto de recurso, defina com.snc.integration.scim2.provider.customization.script.id como vazio ou retorne como nulo.
    • Se determinados atributos forem persistentes por meio do script onAfter, eles deverão ser preenchidos com valores de banco de dados no objeto scimResource dentro do script personalizado. Esta ação é necessária para que o sistema possa fazer o seguinte:
      • Para obter o objeto scimResource correto em scripts onAfter durante a operação PUT e PATCH.
      • Para incluir os atributos que persistiram por meio do script onAfter na resposta de retorno para o cliente.

    Funções de ajuda

    A seguir estão algumas das funções de ajuda para personalização do SCIM. Essas funções permitem que você obtenha ou defina diferentes tipos de informações.

    Tabela 1. Funções de ajuda
    Função Finalidade
    SCIMProviderCustomization.prototype.getCustomExtensionUrn.call(this, "User"); Obter o valor do esquema de extensão personalizado.
    SCIMProviderCustomization.prototype.getServiceNowExtensionUrn.call(this, "User"); Obter o valor do esquema da extensão da ServiceNow.
    SCIMProviderCustomization.prototype.getCustomExtensionNodeValue.call(this, "User", context); Obter o nó do esquema personalizado da resposta.
    SCIMProviderCustomization.prototype.getServiceNowExtensionNodeValue.call(this, "User", context); Obter o nó do esquema personalizado da ServiceNow da resposta.
    SCIMProviderCustomization.prototype.setCustomExtensionNodeValue.call(this, "User", context, customExtensionValue); Definir o nó do esquema personalizado na resposta.
    A seguir está um exemplo de uso da função de ajuda:
    var customExtensionUrn = 
    SCIMProviderCustomization.prototype.getCustomExtensionUrn.call(this, "User"); 
    var customExtensionValue = 
    SCIMProviderCustomization.prototype.getCustomExtensionNodeValue.call(this, "User", context); 
    customExtensionValue.age = "18";
    SCIMProviderCustomization.prototype.setCustomExtensionNodeValue call(this, "User", context, customExtensionValue); 
    Nota:
    O RTE oferece suporte à configuração de dados em tabelas diferentes das tabelas sys_user e sys_user_group.