매핑되지 않은 필드 처리

  • 릴리스 버전: Xanadu
  • 업데이트 날짜 2024년 08월 01일
  • 읽기9분
  • 다양한 방법으로 SCIM 커스터마이제이션에서 매핑되지 않은 필드를 처리할 수 있습니다.

    SCIM 커스터마이제이션 중에 sys_user 및 sys_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 스크립트를 확장하여 스크립트를 사용하여 사용자 지정할 수 있습니다.

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

    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 methods에 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 테이블 이외의 테이블에서 데이터 설정을 지원합니다.