매핑되지 않은 필드 처리

  • 릴리스 버전: Australia
  • 업데이트 날짜 2026년 03월 12일
  • 소요 시간: 9분
  • SCIM 커스터마이제이션에서 매핑되지 않은 필드를 다양한 방법으로 처리할 수 있습니다.

    SCIM 커스터마이제이션 중에 다음 기능을 수행하여 sys_usersys_user_group 테이블에 속하지 않는 필드를 매핑할 수 있습니다.

    SCIM 사용자 지정(만들기 또는 업데이트)

    SCIM 클라이언트를 만들거나 업데이트할 수 있습니다.

    • SCIM 관리자는 ETL 정의 또는 RTE에 매핑되지 않은 필드에 대한 스크립트와 스크립트에 사용자 지정 스크립트 onBeforeonAfter 를 추가할 수 있습니다.
    • SCIM 관리자는 및 onAfter 스크립트에 onBefore 사용자 지정 스크립트를 추가하여 RTE 매핑을 재정의할 수 있습니다.
    • RTE onBefore 또는 onAfter 스크립트에서 스크립트 가능한 API를 호출하여 수신 요청에 액세스하고 다른 테이블, 목록 및 매핑되지 않은 속성에서 변환을 수행할 수 있습니다.
    • 메서드를 sn_auth.SCIM2Util.getScimProviderCustomizationContext() 사용하여 객체가 포함된 SCIM 요청 컨텍스트를 제공할 수 있습니다 scimResource . in 컨텍스트는 scimResource 각 작업에서 다음을 나타냅니다.
      • POST: 요청 페이로드에서 전송된 SCIM 자원입니다.
      • PUT: 데이터베이스의 현재 SCIM 자원이 요청 페이로드에서 전송된 SCIM 자원으로 대체되었습니다.
      • PATCH: 패치 작업을 수행한 후 데이터베이스의 현재 SCIM 자원입니다.
    다음은 스크립트의 예입니다 onAfter .
    (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);

    SCIM 응답 사용자 지정

    GET API 호출의 경우 SCIM 클라이언트에 대한 모든 응답은 스크립트를 확장하여 스크립트를 사용하여 사용자 지정할 수 있습니다 SCIMProviderCustomization .

    스크립트를 확장하는 동안 작성자는 and customizeGroupResponse 메서드를 customizeUserResponse 재정의하여 사용자 및 그룹 자원에 대한 응답을 수정할 수 있습니다.

    com.snc.integration.scim2.provider.customization.script.id 속성을 사용하면 SCIM 플러그인이 응답 커스터마이제이션에 사용해야 하는 스크립트를 사용할 수 있습니다.

    다음은 기본 스크립트를 확장하는 예입니다.
    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'
    });
    주:
    • and customizeGroupResponse 메서드에 customizeUserResponse 포함된 매개변수는 라는 하나의 속성scimResource이 있는 컨텍스트 객체입니다. 이 속성에는 사용자 또는 그룹 자원 객체의 모든 속성이 포함됩니다.
    • 사용자 지정 스크립트 포함은 관리자만 만들고 볼 수 있습니다.
    • 사용자 또는 그룹 자원이 수정되면 컨텍스트를 다시 반환해야 합니다.
    • 자원 객체에서 속성을 수정하지 않은 경우 비 com.snc.integration.scim2.provider.customization.script.id 워 두거나 null로 반환합니다.
    • 특정 속성이 스크립트를 onAfter 통해 유지되는 경우 사용자 지정된 스크립트 내의 객체에 scimResource 있는 데이터베이스 값으로 채워야 합니다. 이 작업은 시스템에서 다음을 수행할 수 있도록 하기 위해 필요합니다.
      • PUT 및 PATCH 작업 중에 스크립트에서 onAfter 올바른 scimResource 객체를 가져옵니다.
      • 클라이언트에 대한 응답에 스크립트를 onAfter 통해 유지되는 속성을 포함하기 위해서입니다.

    도우미 기능

    다음은 SCIM 사용자 지정을 위한 도우미 함수의 일부입니다. 이러한 기능을 사용하면 다양한 유형의 정보를 가져오거나 설정할 수 있습니다.

    표 1. 도우미 기능
    함수 목적
    SCIMProviderCustomization.prototype.getCustomExtensionUrn.call(this, "User"); 사용자 지정 확장 스키마의 값을 가져옵니다.
    SCIMProviderCustomization.prototype.getServiceNowExtensionUrn.call(this, "User"); 확장 스키마의 ServiceNow 값을 가져옵니다.
    SCIMProviderCustomization.prototype.getCustomExtensionNodeValue.call(this, "User", context); 응답에서 사용자 지정 스키마 노드를 가져옵니다.
    SCIMProviderCustomization.prototype.getServiceNowExtensionNodeValue.call(this, "User", context); 응답에서 스키마 노드 가져오기 ServiceNow
    SCIMProviderCustomization.prototype.setCustomExtensionNodeValue.call(this, "User", context, customExtensionValue); 응답에서 사용자 지정 스키마 노드를 설정합니다.
    다음은 도우미 함수를 사용하는 예입니다.
    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); 
    주:
    RTE는 sys_user 및 sys_user_group 테이블 이외의 테이블에서 데이터 설정을 지원합니다.