本文详细介绍了如何在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
的引用方式。
字段名 | 数据类型 | 说明 |
userId | String | 用户ID。 |
username | String | 用户名。 |
passwordSet | boolean | 密码是否已设置。
|
displayName | String | 用户显示名。 |
phoneRegion | String | 手机地区编号,示例:中国区号为 "86",不带 "00" 或 "+"。 |
phoneNumber | String | 手机号。 |
phoneNumberVerified | boolean | 手机号是否已验证。
|
String | 邮箱。 | |
emailVerified | boolean | 邮箱是否已验证。
|
userExternalId | String | 用户外部ID。 |
userSourceType | String | 来源类型,取值为:
|
userSourceId | String | 来源ID。 |
status | String | 用户状态,取值为:
|
accountExpireTime | Long | 用户过期时间,UNIX时间戳,单位毫秒。 |
registerTime | Long | 用户注册时间,UNIX时间戳,单位毫秒。 |
passwordExpireTime | Long | 密码过期时间,UNIX时间戳,单位毫秒。 |
lockExpireTime | Long | 锁定过期时间,UNIX时间戳,单位毫秒。 |
createTime | Long | 创建时间,UNIX时间戳,单位毫秒。 |
updateTime | Long | 最近一次更新用户信息的时间,UNIX时间戳,单位毫秒。 |
description | String | 描述。 |
primaryOrganizationalUnitId | String | 主机构ID。 |
groups | Array | 账户所属组列表。 |
| String | 账户组ID。 |
| String | 账户组名称。 |
| String | 账户组描述。 |
| String | 账户组外部ID。 |
organizationalUnits | Array | 账户所属组织列表。 |
| String | 所属组织ID。 |
| String | 所属组织名称。 |
| boolean | 是否主组织。
|
customFields | Array | 扩展属性。 |
| String | 扩展属性标识。 |
| String | 扩展属性值。 |
customFieldMap | Map<String,Object> |
|
identityProviderUsers | Array | 用户在身份提供方的信息。 |
| String | 身份提供方ID。 |
| String | 身份提供方类型 ding_talk:钉钉。 ad:AD。 ldap:LDAP。 we_com:企业微信。 lark:飞书。 |
| String | 身份提供方的外部ID。 |
| String | 用户在身份提供方的UserId。 |
identityProviderUserMap | Map<String,Object> | key是identityProviderId, value是IdentityProviderUser对象。 |
2. App User
下列字段在IDaaS的AppUser模型中,可使用类似appUser.username
引用方式。
属性 | 说明 |
username | 应用账号用户名。 |
3. IdP User
IdP User模型应用于与身份提供方进行同步时,举例:钉钉的办公地点字段:idpuser.work_place
。
具体字段请查看对应身份提供方文档,例如钉钉的钉钉帮助文档-用户详情。
对于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且参数长度大于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或空字符串时,输出为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.对象属性) | 取数组对象中的某个属性的值形成新的数组。 | 取用户中所属组的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的条件,则返回ture。 | 示例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
|
参考示例
效果 | 表达式示例 |
取用户名,拼接固定 "@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"
}