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
相关产品推荐
相关产品推荐

