Umgang mit nicht zugeordneten Feldern

  • Freigeben Version: Washingtondc
  • Aktualisiert 1. Februar 2024
  • 3 Minuten Lesedauer
  • Sie können nicht zugeordnete Felder in der SCIM-Anpassung auf verschiedene Arten 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 benutzerdefinierte Skripts in den Skripts 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 benutzerdefinierte Skripts in den Skripts 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.
    • Sie können die Methode sn_auth.SCIM2Util.getScimProviderCustomizationContext() verwenden, um den SCIM-Anforderungskontext bereitzustellen, der das Objekt scimResource enthält. scimResource im Kontext stellt in jedem Vorgang Folgendes dar:
      • POST: Die in der Anforderungsnutzlast gesendete SCIM-Ressource.
      • PUT: Die aktuelle SCIM-Ressource aus der Datenbank, ersetzt durch die in der Anforderungsnutzlast gesendete SCIM-Ressource.
      • PATCH: Die aktuelle SCIM-Ressource aus der Datenbank nach den Patch-Vorgängen.
    Das Folgende ist ein Beispiel für ein onAfter -Skript.
    (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

    Für die GET-API-Aufrufe 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.

    Die Eigenschaft com.snc.integration.scim2.provider.customization.script.id ermöglicht es dem SCIM-Plugin, das Skript zu verwenden, das für die Antwortanpassung verwendet werden soll.

    Das Folgende ist ein Beispiel für die Erweiterung des Basisskripts.
    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'
    });
    Hinweis:
    • Der Parameter, den die Methoden customizeUserResponse und customizeGroupResponse enthalten, ist ein Kontextobjekt mit einem Attribut namens scimResource. Dieses Attribut weist alle Attribute eines Benutzer- oder Gruppenressourcenobjekts auf.
    • Eine benutzerdefinierte Skripteinbindung kann nur vom Administrator erstellt und angezeigt werden.
    • Wenn eine Benutzer- oder Gruppenressource geändert wird, müssen Sie den Kontext wiederherstellen.
    • Wenn ein Attribut im Ressourcenobjekt nicht geändert wird, legen Sie com.snc.integration.scim2.provider.customization.script.id auf leer fest, oder geben Sie NULL zurück.
    • Wenn bestimmte Attribute über das Skript onAfter beibehalten werden, müssen sie im benutzerdefinierten Skript mit Datenbankwerten im Objekt scimResource ausgefüllt werden. Diese Aktion ist erforderlich, damit das System Folgendes ausführen kann:
      • So erhalten Sie das richtige scimResource -Objekt in onAfter -Skripts während des PUT- und PATCH-Vorgangs.
      • Um die Attribute, die über 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.

    Tabelle : 1. Hilfsfunktionen
    Funktion Zweck
    SCIMProviderCustomization.prototype.getCustomExtensionUrn.call(this, "User"); Rufen Sie den Wert des benutzerdefinierten 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 benutzerdefinierten 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 benutzerdefinierten Schemaknoten in der Antwort fest.
    Das folgende Beispiel zeigt die Verwendung der Hilfsfunktion:
    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); 
    Hinweis:
    RTE unterstützt das Festlegen von Daten in anderen Tabellen als den Tabellen „sys_user“ und „sys_user_group“.