Rego策略开发疑问:如何实现input_set存在值匹配allow_values时策略通过
问题描述
我想实现一条Rego策略:当input_set中存在至少一个值与allow_values中的值匹配时,策略通过。我对some关键字的用法理解有问题,希望能得到更优的实现方式。
示例代码
package sometesting import future.keywords # 需要校验的数据集 input_set := {"b-phone", "a-pad", "a-car"} # 允许通过的值集合 allow_values := {"b-phone", "a-pad"} # 逐个值校验的写法(可行但不够灵活) policy_1[result] { not "b-phone" in input_set not "a-pad" in input_set result := "policy_failed" } # 尝试用some关键字但未达预期的写法 policy_2[result] { some value in input_set not value in allow_values # 我原本以为这里会返回: # true(对应a-car) # false(对应b-phone) # false(对应a-pad) result := "policy_failed" } # 我期望的逻辑是:只要some语句中有一个结果为false,策略就不失败,但实际理解有误 policy_3[result] { true false false result := "policy_failed" }
我尝试的可行写法(无权限添加为答案)
policy_2[result] { in_allowed_values result := "policy_failed" } in_allowed_values := false { contains(allow_values[_], input_values[_]) } else = true
正确实现思路
你的核心需求是:只要input_set和allow_values有交集,策略就通过;只有当input_set里没有任何一个值在allow_values中时,策略才失败。
先说明你用some时的问题:policy_2的逻辑是“存在某个value在input_set中,且不在allow_values里”——只要满足这个条件(比如a-car),就会生成policy_failed结果,这和你的需求完全相反。你需要的是“当没有任何value同时满足「在input_set且不在allow_values」时”才失败,或者说“当存在value同时在两个集合中时,策略通过”。
最优实现方式
直接利用Rego的集合交集特性,写法简洁高效:
package sometesting import future.keywords input_set := {"b-phone", "a-pad", "a-car"} allow_values := {"b-phone", "a-pad"} # 规则1:只有当两个集合完全无交集时,返回失败 policy_failed[result] { count(input_set & allow_values) == 0 result := "policy_failed" } # 规则2:正向定义“策略通过”的逻辑,更直观 policy_passed[result] { some value in input_set value in allow_values result := "policy_passed" }
写法解释
policy_failed:用input_set & allow_values计算两个集合的交集,若交集大小为0,说明没有匹配的允许值,返回失败。这种写法最适合集合类的校验场景。policy_passed:用some遍历input_set,只要找到一个在allow_values里的值,就返回通过——这符合你最初想用some的思路,但逻辑是正向判断“存在匹配值则通过”,而非反向判断“存在不匹配值则失败”。
你补充写法的修正
你补充的代码里存在未定义变量input_values,且contains的用法不符合Rego的集合判断逻辑,修正后应该是:
policy_2[result] { # 当没有任何值匹配允许集合时,返回失败 not in_allowed_values result := "policy_failed" } in_allowed_values { some value in input_set value in allow_values }
但这种写法不如直接用集合交集或正向判断简洁。
内容的提问来源于stack exchange,提问作者user3367760
相关产品推荐
相关产品推荐

