매핑되지 않은 필드 처리
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 사용자 지정을 위한 도우미 함수 중 일부입니다. 이러한 함수를 사용하면 다양한 유형의 정보를 가져오거나 설정할 수 있습니다.
| 함수 | 목적 |
|---|---|
| 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 테이블 이외의 테이블에서 데이터를 설정할 수 있도록 지원합니다.