Como lidar com campos não mapeados
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.
(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.
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'
});- 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.
| 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. |
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);