如何用OPA Rego实现任务标签与用户标签的全匹配过滤?
问题:筛选用户标签完全覆盖任务标签的任务
我有两类数据:
- 带有“必须匹配”标签的任务列表
- 带有标签的用户
需求是筛选出所有任务标签均与用户标签匹配的任务(用户可以拥有额外标签,只要任务的每一个标签键值对都能在用户标签中找到对应匹配即可)。
输入数据
rego-input(用户数据)
{ "user":"user-1", "tags":{"loc":"NY","type":"L1","group":"admin"} }
rego-data(任务数据)
{ "proj":"abc1", "tasks":[ {"tags":{"loc":"NJ","type":"L1"},"title":"task-1"}, {"tags":{"loc":"NY","type":"L1"},"title":"task-2"}, {"tags":{"loc":"PA","type":"L2"},"title":"task-3"}] }
预期输出
{ "user":"user-1", "tasks":[ {"tags":{"loc":"NY","type":"L1"},"title":"task-2"} ] }
实现的Rego代码
package example import input as user import data as project # 筛选符合标签匹配要求的任务 allow_task[task] { task := project.tasks[_] # 验证任务的所有标签键值对都能在用户标签中找到完全匹配 all k, v in task.tags { user.tags[k] == v } } # 组装最终输出结构 output := { "user": user.user, "tasks": allow_task }
代码说明
allow_task[task]规则负责筛选任务:- 遍历所有任务
project.tasks[_] - 通过
all k, v in task.tags遍历任务的每一组标签,确保用户标签中存在相同键且对应值完全一致
- 遍历所有任务
- 最终输出将用户名和筛选后的任务列表组合成预期格式
内容的提问来源于stack exchange,提问作者sriba
相关产品推荐
相关产品推荐

