매핑되지 않은 필드 처리

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

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

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

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

    • SCIM 관리자는 ETL 정의 또는 RTE에 매핑되지 않은 필드에 대한 및 onAfter 스크립트에 onBefore 사용자 지정 스크립트를 추가할 수 있습니다.
    • SCIM 관리자는 및 onAfter 스크립트에 사용자 지정 스크립트를 추가하여 RTE 매핑을 onBefore 재정의할 수 있습니다.
    • 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하나의 속성이 있는 컨텍스트 객체입니다. 이 속성에는 사용자 또는 그룹 자원 개체의 모든 속성이 있습니다.
    • 사용자 지정된 스크립트 포함은 관리자만 작성하고 볼 수 있습니다.
    • 사용자 또는 그룹 자원이 수정되면 컨텍스트를 다시 반환해야 합니다.
    • 리소스 개체에 속성이 수정되지 않은 경우 the를 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 테이블 이외의 테이블에서 데이터를 설정할 수 있도록 지원합니다.