Behandelt nicht zugeordnete Felder
Sie können nicht zugeordnete Felder in der SCIM-Anpassung auf unterschiedliche Weise behandeln.
Während der SCIM-Anpassung können die Felder, die nicht Teil der Tabellen „sys_user“ und „sys_user_group“ sind, durch Ausführen der folgenden Funktionen zugeordnet werden.
SCIM anpassen (Erstellen oder aktualisieren)
Sie können den SCIM-Client erstellen oder aktualisieren.
- Der SCIM-Administrator kann anwenderdefinierte Skripts in den Skripten onBefore und onAfter für Felder hinzufügen, die nicht in der ETL-Definition oder RTE zugeordnet sind.
- Der SCIM-Administrator kann RTE-Zuordnungen überschreiben, indem er anwenderdefinierte Skripts in den Skripten onBefore und onAfter hinzufügt.
- Sie können eine skriptfähige API in den RTE-Skripts onBefore oder onAfter aufrufen, um auf eingehende Anforderungen zuzugreifen und Transformationen für andere Tabellen, Listen und nicht zugeordnete Attribute durchzuführen.
- Mit der Methode sn_auth.SCIM2Util.getScimProviderCustomizationContext() können Sie den SCIM-Anforderungskontext angeben, der das Objekt scimResource enthält. scimResource im Kontext steht bei jedem Vorgang für Folgendes:
- POST: Die SCIM-Ressource, die in der Anforderungsnutzlast gesendet wird.
- PUT: Die aktuelle SCIM-Ressource aus der Datenbank, die durch die in der Anforderungsnutzlast gesendete SCIM-Ressource ersetzt wird.
- PATCH: Die aktuelle SCIM-Ressource aus der Datenbank nach der Durchführung der Patch-Vorgänge.
(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);Passen Sie die SCIM-Antwort an
Bei den GET-API-Aufrufen kann jede Antwort an den SCIM-Client mithilfe des Skripts angepasst werden, indem das Skript SCIMProviderCustomization erweitert wird.
Beim Erweitern des Skripts kann der Autor die Methoden customizeUserResponse und customizeGroupResponse überschreiben, um die Antworten für Benutzer- und Gruppenressourcen zu ändern.
Mit der Eigenschaft com.snc.integration.scim2.provider.customization.script.id kann das SCIM-Plugin das Skript verwenden, das für die Anpassung der Antwort verwendet werden soll.
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'
});- Der Parameter, den die Methoden customizeUserResponse und customizeGroupResponse enthalten, ist ein Kontextobjekt mit einem Attribut namens scimResource. Dieses Attribut weist alle Attribute eines Anwender- oder Gruppenressourcenobjekts auf.
- Eine anwenderdefinierte Skripteinbindung kann nur vom Administrator erstellt und angezeigt werden.
- Wenn eine Benutzer- oder Gruppenressource geändert wird, müssen Sie den Kontext wiederherstellen.
- Wenn kein Attribut im Ressourcenobjekt geändert wird, legen Sie com.snc.integration.scim2.provider.customization.script.id auf leer fest, oder geben Sie es als NULL zurück.
- Wenn bestimmte Attribute über das Skript onAfter beibehalten werden, müssen sie mit Datenbankwerten im Objekt scimResource im angepassten Skript gefüllt werden. Diese Aktion ist erforderlich, damit das System Folgendes ausführen kann:
- Zum Abrufen des richtigen scimResource -Objekts in onAfter -Skripts während des PUT- und PATCH-Vorgangs.
- Um die Attribute, die durch das Skript onAfter beibehalten wurden, in die Antwort an den Client aufzunehmen.
Hilfsfunktionen
Im Folgenden sind einige der Hilfsfunktionen für die SCIM-Anpassung aufgeführt. Mit diesen Funktionen können Sie verschiedene Arten von Informationen abrufen oder festlegen.
| Funktion | Zweck |
|---|---|
| SCIMProviderCustomization.prototype.getCustomExtensionUrn.call(this, "User"); | Rufen Sie den Wert des anwenderdefinierten Erweiterungsschemas ab. |
| SCIMProviderCustomization.prototype.getServiceNowExtensionUrn.call(this, "User"); | Rufen Sie den Wert des Erweiterungsschemas ServiceNow ab. |
| SCIMProviderCustomization.prototype.getCustomExtensionNodeValue.call(this, "User", context); | Rufen Sie den anwenderdefinierten Schemaknoten aus der Antwort ab. |
| SCIMProviderCustomization.prototype.getServiceNowExtensionNodeValue.call(this, "User", context); | Rufen Sie den Schemaknoten ServiceNow aus der Antwort ab |
| SCIMProviderCustomization.prototype.setCustomExtensionNodeValue.call(this, "User", context, customExtensionValue); | Legen Sie den anwenderdefinierten Schemaknoten in der Antwort fest. |
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);