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 le et onAfter des onBefore scripts pour les champs qui ne sont pas mappés dans la définition ETL ou RTE.
- L’administrateur SCIM peut remplacer les mappages RTE en ajoutant des scripts personnalisés dans les onBefore scripts and onAfter .
- Vous pouvez appeler une API scriptable dans le ou les RTE onBefore pour onAfter accéder à la demande entrante et effectuer des transformations sur d’autres tables, listes et attributs non mappés.
- Vous pouvez utiliser la sn_auth.SCIM2Util.getScimProviderCustomizationContext() méthode pour fournir le contexte de demande SCIM qui contient l’objet scimResource . Le scimResource contexte dans 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.
- PATCH : 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.
Lors de l’extension du script, l’auteur peut remplacer les customizeUserResponse méthodes et customizeGroupResponse pour modifier les réponses des ressources Utilisateur et Groupe.
Cette 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 de la réponse.
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 et customizeGroupResponse est un objet de contexte avec un attribut appelé scimResource. Cet attribut possède tous les attributs d’un objet de ressource d’utilisateur ou de 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 rétablir le contexte.
- S’il n’y a aucune modification d’un attribut dans l’objet de ressource, définissez le com.snc.integration.scim2.provider.customization.script.id champ vide ou le renvoie comme nul.
- 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 nécessaire pour que le système puisse effectuer les actions suivantes :
- Pour obtenir le bon scimResource objet dans onAfter les scripts pendant l’opération PUT et PATCH.
- Pour 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’aide pour la personnalisation SCIM. Ces fonctions vous permettent d’extraire ou de définir différents types d’informations.
| Fonction | Objectif |
|---|---|
| SCIMProviderCustomization.prototype.getCustomExtensionUrn.call(this, "User"); | Extraire la valeur du schéma d’extension personnalisé. |
| SCIMProviderCustomization.prototype.getServiceNowExtensionUrn.call(this, "User"); | Extraire la valeur du schéma des extensions ServiceNow . |
| SCIMProviderCustomization.prototype.getCustomExtensionNodeValue.call(this, "User", context); | Récupérer le nœud de schéma personnalisé à partir de la réponse. |
| SCIMProviderCustomization.prototype.getServiceNowExtensionNodeValue.call(this, "User", context); | Récupérer 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);