本文詳細介紹了如何在IDaaS的內建運算式引擎中使用進階賬戶欄位運算式,以及詳細的模型欄位說明、函數說明及相應的參考樣本。
基礎說明
IDaaS內建了運算式引擎,在SAML和OIDC應用中,支援使用進階運算式,向返回使用者資訊中添加新的參數。當目標應用需接受額外參數,且參數需要進行某種轉化、拼接、判斷時,可使用運算式實現。
與此類似,可以使用同樣方法,在配置與身份提供方間同步的欄位對應時,也可使用運算式實現欄位值自訂賦值。
本篇文檔下方列有參考樣本,協助快速理解運算式使用情境和方法。
以OIDC為例,在SSO配置中,支援擴充返回的id_token資訊。在擴充值中,可填寫進階運算式full_phone,以達成特定處理目標。操作路徑為:進入OIDC應用的SSO配置頁面,在id_token擴充欄位配置地區的擴充值輸入框中,填寫所需的運算式(如full_phone)。
更多使用方式請參考:SAML Attribute Statements值填寫規範、OIDC id_token擴充值填寫規範、欄位管理。
運算式分為兩部分:
-
模型,包含User(對應IDaaS賬戶)和AppUser(對應應用賬戶)兩種。
-
函數,代表執行邏輯關係。
模型說明
1. User
下欄欄位在IDaaS的User模型中,可使用類似user.username、user.lockExpireTime 的引用方式。
|
字段显示名称 |
字段标识 |
数据类型 |
是否必填 |
是否唯一 |
用户侧权限 |
說明 |
|
賬戶 ID |
userId |
字串 |
否 |
是 |
可見 |
使用者ID。 |
|
賬戶名 |
username |
字串 |
是 |
是 |
可見 |
使用者名稱。 |
|
顯示名稱 |
displayName |
字串 |
否 |
否 |
可編輯 |
使用者顯示名稱。 |
|
郵箱 |
|
字串 |
否 |
是 |
可編輯 |
郵箱。 |
|
手機 |
phoneNumber |
數字 |
否 |
是 |
可編輯 |
手機號。 |
|
手機區號 |
phoneRegion |
數字 |
否 |
否 |
可編輯 |
手機地區編號,樣本:中國區號為 "86",不帶 "00" 或 "+"。 |
|
外部 ID |
userExternalId |
字串 |
否 |
是 |
可見 |
使用者外部ID。 |
|
來源類型 |
userSourceType |
字串 |
否 |
否 |
可見 |
來源類型,取值為:
|
|
來源 ID |
userSourceId |
字串 |
否 |
否 |
可見 |
來源ID。 |
|
賬戶狀態 |
status |
字串 |
否 |
否 |
可見 |
使用者狀態,取值為:
|
|
描述 |
description |
字串 |
否 |
否 |
可見 |
描述。 |
|
賬戶到期時間 |
accountExpireTime |
數字 |
否 |
否 |
可見 |
使用者到期時間,UNIX時間戳記,單位毫秒。 |
|
賬戶註冊時間 |
registerTime |
數字 |
否 |
否 |
可見 |
使用者註冊時間,UNIX時間戳記,單位毫秒。 |
|
密碼到期時間 |
passwordExpireTime |
數字 |
否 |
否 |
可見 |
密碼到期時間,UNIX時間戳記,單位毫秒。 |
|
鎖定到期時間 |
lockExpireTime |
數字 |
否 |
否 |
可見 |
鎖定到期時間,UNIX時間戳記,單位毫秒。 |
|
建立時間 |
createTime |
數字 |
否 |
否 |
可見 |
建立時間,UNIX時間戳記,單位毫秒。 |
|
更新時間 |
updateTime |
數字 |
否 |
否 |
可見 |
最近一次更新使用者資訊的時間,UNIX時間戳記,單位毫秒。 |
2. App User
下欄欄位在IDaaS的AppUser模型中,可使用類似appUser.username引用方式。
|
屬性 |
說明 |
|
username |
應用帳號使用者名稱。 |
3. IdP User
IdP User模型應用於與身份提供方進行同步時,舉例:DingTalk的辦公地點欄位:idpUser.work_place。
具體欄位請查看對應身份提供方文檔,例如DingTalk的DingTalk協助文檔-使用者詳情。
對於OIDC身份提供方(參考綁定OIDC身份提供方),在自動綁定能力中使用運算式時,僅id_token中的sub、phoneNumber、email欄位的首碼使用idpUser.,例如idpUser.sub;其餘欄位的首碼需使用idpUser.rawUserInfo.,例如idpUser.rawUserInfo.aud。
函數說明
以下為我們開放的對應的函數及樣本:
|
函數名 |
函數定義 |
說明 |
舉例 |
|
Append |
Append(str1, str2, ..., strn) |
拼接輸入參數為新的字串,等於 |
|
|
Join |
Join(source1, source2, ..., sourceN, separator) |
將多個源值拼接為一個字串,源值間用分隔字元分隔。 |
|
|
Coalesce |
Coalesce(source1, source2, ..., sourceN, defaultValue) |
返回輸入參數中第一個不允許為 NULL 的參數,若參數都為空白,則返回null,其中非空指非null且參數長度大於0。 |
|
|
IIF |
IIF(condition, whenTrue, whenFalse) |
三目運算。根據condition的結果返回不同的值,為true時返回whenTrue,為false時返回whenFalse。 |
樣本1:
樣本2:
|
|
IsNull |
IsNull(value) |
當value為null即缺失時,輸出為true。 |
樣本1:
樣本2:
|
|
IsNullOrEmpty |
IsNullOrEmpty(value) |
當value為null或Null 字元串時,輸出為true。 |
樣本1:
樣本2:
|
|
Now |
Now() |
返回表示當前UTC DateTime的字串,格式為 yyyy-MM-dd'T'HH:mm:ssXXX。 |
|
|
StringReplace |
StringReplace("hello $VariableName", "$VariableName", ReplaceString) |
一般字元串替換。 |
|
|
Trim |
Trim(source) |
去除源值字串前後的空白字元。 |
|
|
TrimLeft |
TrimLeft(source) |
去除源值字串左側的空白字元。 |
|
|
TrimRight |
TrimRight(source) |
去除源值字串右側的空白字元。 |
|
|
ToLower |
ToLower(source) |
字串變為全大寫或全小寫。 |
|
|
ToUpper |
ToUpper(source) |
字串變為全大寫。 |
|
|
Substring |
Substring(source, fromIndex, endIndex) |
返回字串的子字串,即子字串下標地址為 [fromIndex, endIndex]。
|
樣本1:
樣本2:
樣本3:
|
|
SubstringBefore |
SubstringBefore(source, subString) |
返回源字串中從左至右匹配到的第一個目標字串後的字串。若目標字串不存在,則返回null。 參數:
傳回值:string |
樣本1:
|
|
Array |
Array(source1, source2,...) |
將多個值組合成為數組。值可為Object類型。 |
|
|
ArrayAdd |
ArrayAdd(Array(), "test") |
在數組對象中添加一個數組。 |
|
|
ArrayMap |
ArrayMap($ArrayObject, __item.ObjectProperty) |
取數組對象中的某個屬性的值形成新的數組。 |
取使用者中所屬組的ID列表:
|
|
ArrayIndex |
ArrayIndex(Array(), n) |
取Array第幾個元素,從0開始。 |
|
|
ArrayJoin |
ArrayJoin(Array(), str) |
數組以某個字串拼接。 |
|
|
Object |
Object(key1, value1, key2, value2, ...) |
通過制定索引值對組合成為Object對象。 支援零個或偶數個參數。 |
|
|
ObjectIndex |
ObjectIndex(user, "username") |
指定對象的某個屬性的值 |
代碼 |
|
ObjectToJsonString |
ObjectToJsonString(user.groups) |
對象轉JSON字串。 |
- |
|
Contains |
Contains(str1,str2) |
判斷是否包含,返回true,false。 |
樣本1:
樣本2:
|
|
Or |
Or(true,false,...,true) |
或的方式判斷多個條件,有一個條件為true,則為true。 |
樣本1:
樣本2:
樣本3:
|
|
And |
And(true,false,...,true) |
且的方式判斷多個條件,有一個條件為false,則為false。 |
樣本1:
樣本2:
樣本3:
|
|
xOr |
xOr(true,false,...,true) |
有且只能有2個條件。 如果都為true或者都為false,則返回false。 如果同時存在true,false的條件,則返回true。 |
樣本1:
樣本2:
樣本3:
|
|
StartsWith |
StartsWith(str1, str2) |
判斷字串以...開頭,只能包含2個參數。 |
樣本1:
樣本2:
|
|
Split |
Split("str1,str2,str3") |
字串分割後,返回一個數組。 |
樣本1:
|
|
Equals |
Equals(str1,str2) |
比較2個字串是否一致。 Equals(str1,str2)。 Equals(str1,str2,false) 不忽略大小寫比較。 Equals(str1,str2,true) 忽略大小寫比較。 |
樣本1:
樣本2:
樣本3:
|
|
CurrentTimeMillis |
CurrentTimeMillis() |
目前時間UNIX時間戳記,單位毫秒。 |
- |
|
SamlArray |
SamlArray(Array()) |
僅SAML SSO可用。 |
輸入:
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:type="xsd:string"> group1 group2
|
|
ExtractPhoneRegion |
ExtractPhoneRegion(source, defaultRegion,autoAppendPlusSignal) |
提取手機號中的區號。
|
樣本1: 如果手機號為:
樣本2: 如果手機號為
樣本3: 如果手機號為
|
|
ExtractPhoneNumber |
ExtractPhoneNumber(source, defaultRegion,autoAppendPlusSignal) |
提取手機號中的真實手機號(不含區號)。
|
樣本1: 如果手機號為:
樣本2: 如果手機號為:
樣本3: 如果手機號為:
|
參考樣本
|
效果 |
運算式樣本 |
|
取使用者名稱,拼接固定 "@example.com"。 |
|
|
當郵箱不為空白,返回郵箱。 當郵箱為空白時,取手機號。 |
|
|
當手機號為空白時,預設填寫固定手機號。 |
|
|
將手機號地區和手機號以 - 拼接。 |
|
|
返回包含顯示名稱的自訂歡迎資訊。 |
|
|
將手機號中間四位用 * 脫敏返回。 |
) |
|
提取郵箱中的使用者名稱。 |
|
|
組裝SCIM規範中數組格式的email欄位。 |
|
User模型JSON樣本:
{
"customFieldMap": {
"place": {
"fieldName": "place",
"fieldValue": "beijing"
},
"age": {
"fieldName": "age",
"fieldValue": "18"
}
},
"identityProviderUserMap": {
"idp_m2gngriuenktdkxxxxxx": {
"identityProviderId": "idp_m2gngriuenktdkxxxxxx",
"identityProviderType": "ding_talk",
"identityProviderExternalId": "corp_1234xxxxxxx",
"identityProviderUserId": "b2ed5fc0xxxxx"
}
},
"organizationalUnits": [
{
"organizationalUnitId": "ou_sdfadtaaxxxxxx",
"organizationalUnitName": "name_001",
"primary": false
},
{
"organizationalUnitId": "ou_werttxxxxxx",
"organizationalUnitName": "name_002",
"primary": true
}
],
"primaryOrganizationalUnitId": "ou_werttxxxxxx",
"customFields": [
{
"fieldName": "place",
"fieldValue": "beijing"
},
{
"fieldName": "age",
"fieldValue": "18"
}
],
"groups": [
{
"groupId": "group_jp6al4sn4n4wjgjxxxxxx",
"groupName": "group1",
"groupExternalId": "group_jp6al4sn4n4wjgjxxxxxx"
},
{
"groupId": "group_vavikcxewkf5h3oxxxxxx",
"groupName": "group2",
"groupExternalId": "group_vavikcxewkf5h3oxxxxxx"
}
],
"userId": "user_x3zyd6cxxxxxxxxxxxxx",
"username": "name_001",
"displayName": "displayname_001",
"passwordSet": true,
"phoneRegion": "86",
"phoneNumber": "333xxxx3333",
"phoneNumberVerified": true,
"email": "xxxxx@example.com",
"emailVerified": true,
"userExternalId": "b2ed5fc0xxxxxxxxxx",
"userSourceType": "ding_talk",
"userSourceId": "corp_1234xxxxxxx",
"status": "enabled",
"accountExpireTime": "-1",
"passwordExpireTime": "-1",
"registerTime": "1730454581598",
"lockExpireTime": "-1",
"createTime": "1730454582379",
"updateTime": "1733479455307"
}