使用SCIM账户管理器作为声明提供者时如何访问Curity SCIM属性
Curity SCIM账户管理器与声明提供者配置问题解答
问题背景
我们使用Curity Community 8.4.1版本,采用SCIM作为账户管理器并搭配默认数据源,配置最初创建于2021年的Curity 6.x版本,后续经多次升级保留并扩展。
当创建新声明并选择account-manager-claim-provider作为声明提供者时,遇到以下异常现象:
- 属性下拉列表显示多数SCIM 2.0字段,但选择
userName等多数字段时,声明测试返回空对象(数据库accounts表存在含对应字段的用户数据,且测试无警告) email字段可正常工作,但它并非来自accounts表的attributes列userName(或username)字段无法工作,尽管它也不在attributes列中- 未做转换的情况下配置
name字段可正常工作,但不清楚其值来源(该属性是attributes列中的对象,不在accounts表的顶级列) - 选中属性中建议的其他SCIM schema字段无法工作
- 手动输入
attributes作为选中属性也无法工作
已修改属性查询语句为:
SELECT accounts.* FROM accounts WHERE accounts.username = :subject
切换为默认数据源作为声明提供者,将attributes配置为选中属性时,可正常获取该字段的JSON内容,并能在转换中解析使用,声明测试显示转换前后数据正常。
目前采用的临时方案是:使用默认数据源,先解析attributes字段,再通过转换将所有声明设置到嵌套对象中,避免为每个基于SCIM属性的声明重复解析JSON,但操作较为繁琐。
问题解答
1. 是否可将Curity SCIM账户管理器用作account-manager-claim-provider?若可以,为转换提供attributes参数的正确方式是什么?
可以使用SCIM账户管理器作为account-manager-claim-provider,但需注意以下配置要点:
- SCIM账户管理器的声明提供者会自动映射SCIM标准字段到内部用户模型,不会直接暴露数据库的
attributes列。若需访问attributes中的自定义字段,必须在SCIM账户管理器配置中显式添加自定义属性映射,将attributes内的JSON字段映射为SCIM扩展属性。 - 声明配置的选中属性需使用SCIM标准字段名或已配置的扩展属性URN,而非直接写
attributes。例如,若将attributes中的customField映射为扩展属性urn:custom:schemas:customField,则声明的选中属性需填写该URN。
针对userName字段失效问题,需检查SCIM账户管理器的用户模型映射规则,确保userName被正确映射到数据库的username列(或对应字段),且声明配置中使用标准SCIM字段名userName(注意大小写)。
2. 若必须使用默认数据源而非账户管理器,是否有办法避免为每个声明解析accounts表attributes列中的JSON内容?
有两种简化方案:
- 全局转换脚本:在默认数据源的声明提供者中配置全局入站转换脚本,提前解析
attributes的JSON内容并合并到声明上下文根对象,后续所有声明可直接引用解析后的字段。示例脚本:
function transform(attributes, context) { const parsedAttrs = JSON.parse(attributes.attributes); Object.assign(attributes, parsedAttrs); return attributes; }
- 数据库视图:创建数据库视图将
accounts表的attributes列JSON字段展开为独立列。以PostgreSQL为例:
CREATE VIEW accounts_view AS SELECT id, username, email, (attributes->>'givenName') AS given_name, (attributes->>'familyName') AS family_name, -- 按需添加其他需要展开的字段 attributes FROM accounts;
之后将默认数据源的查询语句改为查询该视图,即可直接在声明配置中选择展开后的字段,无需手动解析JSON。
3. 转换中是否支持ES6?因为使用可选链或Array.prototype.map()会导致配置验证失败,无法提交更新后的配置。
Curity的转换脚本基于Rhino JavaScript引擎,对ES6特性支持有限,可选链?.、箭头函数、部分Array.prototype.map()的高级写法等特性无法直接使用。
替代方案:
- 用传统条件判断替代可选链,例如将
obj?.field改为obj && obj.field - 用
for循环替代Array.prototype.map(),或使用兼容Rhino的ES5写法实现相同逻辑 - 若需使用ES6特性,可提前将代码转译为ES5后再粘贴到转换脚本中
内容的提问来源于stack exchange,提问作者Nickola
相关产品推荐
相关产品推荐

