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

Rego中graph.reachable未输出叶子节点的问题求助

问题原因

graph.reachable 在部分OPA版本中,默认仅会包含那些在关系对象中作为键存在的节点。你的权限节点(如permission:edit、permission:view)并非data.relations.roles的键,因此不会出现在inherits_from的键集合中,最终被排除在可达结果之外。

修复方案

你需要确保所有出现在授权链中的节点(包括权限)都被纳入关系对象中,即使它们没有出边。以下是两种可行的实现方式:

方案一:为权限节点补充空关系条目

保留原有继承规则,同时为所有出现在grants中的节点添加空关系,确保它们被graph.reachable识别:

# 定义角色到授权对象的继承关系
inherits_from[role_id] contains other if {
    some role_id, role_details in data.relations.roles
    some other in role_details.grants
}

# 为所有出现在grants中的节点(含权限)添加空关系
inherits_from[node] = {} if {
    some role_id, role_details in data.relations.roles
    some node in role_details.grants
    not inherits_from[node]
}

effective_subjects = graph.reachable(inherits_from, {"role:admin"})

方案二:统一构建包含所有节点的关系对象

先收集所有相关节点(角色+权限),再为每个节点定义对应的继承关系,无出边的节点返回空集合:

# 收集所有涉及的节点:角色节点 + 权限节点
all_nodes = { node | some role_id, role_details in data.relations.roles; node = role_id } 
            union 
            { node | some role_id, role_details in data.relations.roles; some node in role_details.grants }

# 为每个节点定义继承关系,无出边则返回空集合
inherits_from[node] = { other | some role_id, role_details in data.relations.roles; role_id == node; some other in role_details.grants } else {}

effective_subjects = graph.reachable(inherits_from, {"role:admin"})
预期结果

修复后,effective_subjects将包含所有可达节点:

{
    "effective_subjects": [
        "role:admin",
        "permission:edit",
        "role:viewer",
        "permission:view",
        "role:other"
    ]
}

内容的提问来源于stack exchange,提问作者Philip Couling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:25:23