如何在Rego中构建字符串为键、字符串数组为值的权限字典?
解决Rego策略生成数组格式权限字典的问题
问题背景
我需要用Rego构建一个以字符串为键、字符串数组为值的权限字典,但当前策略生成的是嵌套布尔对象,尝试直接赋值数组时出现eval_conflict_error: object keys must be unique错误。
现有代码与数据
现有Rego策略
package authz import future.keywords.in # The permissions the user has for each property permissions[property_id][permission] { some property_id, property_roles in input.subject.property_roles some permission, roles in data.common.permissions_roles property_roles == roles }
输入数据
{ "subject": { "property_roles": { "K1": [ "R1" ] } } }
参考数据
{ "common": { "permissions_roles": { "property.create": [ "R0" ], "service.read": [ "R1" ], "service.modify": [ "R1" ] } } }
结果对比
预期结果
{ "permissions": { "K1": ["service.modify", "service.read"] } }
当前错误结果
{ "permissions": { "K1": { "service.modify": true, "service.read": true } } }
尝试使用permissions[property_id] = [permission]时出现报错:
policy.rego:6: eval_conflict_error: object keys must be unique
解决方案
要生成数组格式的结果,需要先收集每个property_id对应的所有权限,再将其赋值为数组。修改后的Rego策略如下:
package authz import future.keywords.in # 收集每个property_id对应的所有权限 permissions[property_id] = permissions_list { some property_id in input.subject.property_roles property_roles := input.subject.property_roles[property_id] # 筛选出匹配角色的权限 permissions_list = [permission | some permission, roles in data.common.permissions_roles property_roles == roles ] }
说明
- 先通过
some property_id in input.subject.property_roles遍历所有资产ID - 用数组推导式
[permission | ...]一次性收集所有符合条件的权限,将同一资产ID下的权限整合到一个数组中 - 原方法报错是因为多次为同一个
property_id赋值不同的单元素数组,导致键冲突;数组推导式会生成包含所有匹配项的完整数组,避免了冲突问题
内容的提问来源于stack exchange,提问作者dario
相关产品推荐
相关产品推荐

