本文詳細介紹了如何在IDaaS的內建運算式引擎中使用進階賬戶欄位運算式,以及詳細的模型欄位說明、函數說明及相應的參考樣本。
基礎說明
IDaaS內建了運算式引擎,在SAML和OIDC應用中,支援使用進階運算式,向返回使用者資訊中添加新的參數。當目標應用需接受額外參數,且參數需要進行某種轉化、拼接、判斷時,可使用運算式實現。
與此類似,可以使用同樣方法,在配置與身份提供方間同步的欄位對應時,也可使用運算式實現欄位值自訂賦值。
本篇文檔下方列有參考樣本,協助快速理解運算式使用情境和方法。
以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"
}