You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:56:30