マップされていないフィールドの処理
SCIM のカスタマイズでは、マップされていないフィールドをさまざまな方法で処理できます。
SCIM のカスタマイズ中に、 sys_user テーブルと sys_user_group テーブルに含まれていないフィールドは、次の機能を実行することでマッピングできます。
SCIM のカスタマイズ (作成または更新)
SCIM クライアントを作成または更新できます。
- SCIM アドミンは、ETL 定義または RTE にマッピングされていないフィールドの onBefore および onAfter スクリプトにカスタムスクリプトを追加できます。
- SCIM アドミニストレーターは、onBefore および onAfter スクリプトにカスタムスクリプトを追加することで、RTE マッピングを上書きできます。
- RTE の onBefore または onAfter スクリプトでスクリプト可能な API を呼び出し、着信した要求にアクセスして他のテーブルやリスト、マッピングされていない属性の変換を実行できます。
- sn_auth.SCIM2Util.getScimProviderCustomizationContext() メソッドを使用して、scimResource オブジェクトを含む SCIM 要求コンテキストを提供できます。各操作におけるコンテキスト内の 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 スクリプトを拡張することでカスタマイズできます。
スクリプトを拡張する際に、作成者は customizeUserResponse および customizeGroupResponse メソッドを上書きして、ユーザーリソースとグループリソースの応答を変更できます。
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'
});注:
- customizeUserResponse および customizeGroupResponse メソッドに含まれるパラメーターは、scimResourceという 1 つの属性を持つコンテキストオブジェクトです。この属性には、ユーザーまたはグループのリソースオブジェクトの属性がすべて含まれています。
- カスタマイズされたスクリプトインクルードは、アドミンのみが作成および表示できます。
- ユーザーリソースやグループリソースが変更された場合は、コンテキストを元に戻す必要があります。
- リソースオブジェクトに属性の変更がない場合は、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 テーブル以外のテーブルのデータ設定をサポートしています。