基础说明
IDaaS 内置了表达式引擎,在 SAML 和 OIDC 应用中,支持使用高级表达式,向返回信息中添加新的参数。当目标应用需接受额外参数,且参数需要进行某种转化、拼接、判断时,可使用表达式实现。
与此类似,可以使用同样方法,在配置与身份提供方间同步的字段映射时,也可使用表达式实现字段值自定义赋值。
本篇文档下方列有常见示例,帮助快速理解使用场景和方法。
以 OIDC 为例,在 SSO 配置中,支持扩展返回的 id_token 信息。在扩展值中,可填写高级表达式,以达成特定处理目标。
更多使用方式请参考:SAML Attribute Statements 值填写规范、OIDC id_token 扩展值填写规范、扩展字段。
表达式分为两部分:
模型,包含 User(对应 IDaaS 账户) 和 AppUser(对应
应用账户
) 两种。函数,代表执行逻辑关系。
模型说明
1. User
下列字段在 IDaaS 的 User 模型中,可使用类似 user.username
、user.lockExpireTime
的引用方式。
属性 | 说明 |
username | 用户名 |
displayName | 用户显示名 |
passwordSet | 密码是否已设置 |
phoneRegion | 手机地区编号,示例:中国区号为 "86",不带 "00" 或 "+" |
phoneNumber | 手机号码 |
邮箱 | |
userSourceType | 来源类型,取值为: build_in、ding_talk、ad、ldap、idp_auto_build |
userSourceId | 来源ID |
status | 用户状态,取值为:enabled、disabled |
accountExpireTime | 账户过期时间,UNIX纪元时间,单位毫秒 |
registerTime | 用户注册时间,UNIX纪元时间,单位毫秒 |
lockExpireTime | 锁定过期时间,UNIX纪元时间,单位毫秒 |
updateTime | 最近一次更新时间,UNIX纪元时间,单位毫秒 |
description | 描述 |
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。 |
IsNull | IsNull(value) | 当 value 为 null 即缺失时,输出为 true。 |
IsNullOrEmpty | IsNullOrEmpty(value) | 当 value 为 null 或空字符串时,输出为 true。 |
Now | Now() | 返回表示当前 UTC DateTime 的字符串,格式为 yyyy-MM-dd'T'HH:mm:ssXXX |
StringReplace | StringReplace("hello $VariableName", VariableName, ReplaceString) | 普通字符串替换。 |
Trim | Trim(source) | 去除源值字符串前后的空白字符。 |
ToLower ToUpper | ToLower(source) ToUpper(source) | 字符串变为全大写或全小写。 |
Substring | Substring(source, fromIndex, endIndex) | 返回字符串的子字符串,即子字符串下标地址为 [fromIndex, endIndex]。 |
SubstringBefore | SubstringBefore(source, subString) | 返回 subString 之前的字符串。 |
Array | Array(source1, source2,...) | 将多个值组合成为数组。值可为 Object 类型。 |
Object | Object(key1, value1, key2, value2, ...) | 通过制定键值对组合成为 Object 对象。 |
参考示例
效果 | 表达式示例 |
取用户名,拼接固定 "@example.com"。 | Append(user.username, "@example.com") |
当邮箱不为空,返回邮箱。 当邮箱为空时,取手机号。 | Coalesce(user.email, user.phoneNumber) |
当手机号为空时,默认填写固定手机号。 | IIF(IsNullOrEmpty(user.phoneNumber), "1888888****", user.phoneNumber) |
将手机号地区和手机号以 - 拼接。 | Join(user.phoneRegion, user.phoneNumber, "-") |
返回包含显示名的自定义欢迎信息。 | StringReplace("hello $DisplayName", "$DisplayName", user.displayName) |
将手机号中间四位用 * 脱敏返回。 | Append( SubString(user.phoneNumber, 0, 4), "****", SubString(user.phoneNumber, 8, 10) ) |
提取邮箱中的用户名。 | SubstringBefore(user.email, "@") |
组装 SCIM 规范中数组格式的 email 字段。 | Array(Object("email", user.email, "type", "work", "primary", true)) |