Gestion des champs non mappés
Vous pouvez gérer les champs non mappés dans la personnalisation SCIM de différentes manières.
Lors de la personnalisation SCIM, les champs qui ne font pas partie des tables sys_user et sys_user_group peuvent être mappés en exécutant les fonctions suivantes.
Personnaliser SCIM (créer ou mettre à jour)
Vous pouvez créer ou mettre à jour le client SCIM.
- L’administrateur SCIM peut ajouter des scripts personnalisés dans les scripts et onAfter pour les champs qui ne sont pas mappés dans la onBefore définition ETL ou RTE.
- L’administrateur SCIM peut remplacer les mappages RTE en ajoutant des scripts personnalisés dans les onBefore scripts et onAfter .
- Vous pouvez appeler une API scriptable dans le RTE onBefore ou onAfter des scripts pour accéder à la demande entrante et effectuer des transformations sur d’autres tables, listes et attributs non mappés.
- Vous pouvez utiliser cette sn_auth.SCIM2Util.getScimProviderCustomizationContext() méthode pour fournir le contexte de la requête SCIM qui contient l’objet scimResource . Le scimResource contexte représente les éléments suivants dans chaque opération :
- POST : ressource SCIM envoyée dans la charge utile de la demande.
- PUT : ressource SCIM actuelle de la base de données remplacée par la ressource SCIM envoyée dans la charge utile de la demande.
- CORRECTIF : ressource SCIM actuelle de la base de données après avoir effectué les opérations de correctif.
(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);Personnaliser la réponse SCIM
Pour les appels d’API GET, toute réponse au client SCIM peut être personnalisée à l’aide du script en étendant le SCIMProviderCustomization script.
Tout en étendant le script, l’auteur peut remplacer les customizeUserResponse méthodes et customizeGroupResponse pour modifier les réponses des ressources utilisateur et groupe.
La com.snc.integration.scim2.provider.customization.script.id propriété permet au module d’extension SCIM d’utiliser le script qui doit être utilisé pour la personnalisation des réponses.
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'
});- Le paramètre que contiennent les customizeUserResponse méthodes and customizeGroupResponse est un objet de contexte avec un attribut appelé scimResource. Cet attribut possède tous les attributs d’un objet de ressource utilisateur ou groupe.
- Un include de script personnalisé ne peut être créé et consulté que par l’administrateur.
- Si une ressource utilisateur ou groupe est modifiée, vous devez renvoyer le contexte.
- S’il n’y a aucune modification d’attribut dans l’objet ressource, définissez la valeur vide ou renvoyez la com.snc.integration.scim2.provider.customization.script.id valeur null.
- Si certains attributs sont conservés dans le onAfter script, ils doivent être renseignés avec des valeurs de base de données dans l’objet scimResource à l’intérieur du script personnalisé. Cette action est requise afin que le système puisse effectuer les opérations suivantes :
- Pour obtenir l’objet correct scimResource dans onAfter les scripts pendant l’opération PUT et PATCH.
- Inclure les attributs qui ont persisté via le onAfter script dans la réponse au client.
Fonctions d’aide
Voici quelques-unes des fonctions d’assistance pour la personnalisation SCIM. Ces fonctions vous permettent de récupérer ou de définir différents types d’informations.
| Fonction | Objectif |
|---|---|
| SCIMProviderCustomization.prototype.getCustomExtensionUrn.call(this, "User"); | Extrayez la valeur du schéma d’extension personnalisé. |
| SCIMProviderCustomization.prototype.getServiceNowExtensionUrn.call(this, "User"); | Extrayez la valeur du schéma des ServiceNow extensions. |
| SCIMProviderCustomization.prototype.getCustomExtensionNodeValue.call(this, "User", context); | Récupérez le nœud de schéma personnalisé à partir de la réponse. |
| SCIMProviderCustomization.prototype.getServiceNowExtensionNodeValue.call(this, "User", context); | Extraire le ServiceNow nœud de schéma à partir de la réponse |
| SCIMProviderCustomization.prototype.setCustomExtensionNodeValue.call(this, "User", context, customExtensionValue); | Définissez le nœud de schéma personnalisé dans la réponse. |
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);