如何组合多个规则的结果

How to I combine the results of multiple rules

我有 3 个角色,我正在尝试 return 用户可以根据分配的角色执行哪些操作。

游乐场:https://play.openpolicyagent.org/p/5gN7ObojXh

第一部分应该检查正在处理的对象是否在列表中,然后检查角色return是否有任何动作。

我是 OPA 和 Rego 的新手,当需要进行简单比较以外的任何事情时,我发现它非常令人困惑。

OPA 中的规则是 完整部分。完整的规则是那些评估为单个值的规则,因此如果评估为不同的、冲突的值将失败——例如布尔“允许”规则不能同时为真 为假。

Partial rules either return sets or objects, and are built incrementally 通过评估每个具有相同名称的规则并将结果添加到规则生成的 set/object。

使用部分规则构建集合的示例策略可能如下所示:

package policy

import future.keywords.in

deny["Username found in deny list"] {
    input.user.name in data.users.denylist
}

deny[msg] {
    not "read" in input.user.roles
    msg := sprintf("User %v missing role 'read'", [input.user.name])
}

deny["/admin endpoint requires 'admin' role"] {
    input.request.path[0] == "admin"
    not "admin" in input.user.roles
}

当使用如下输入进行评估时:

{
  "input": {
    "user": {
      "name": "bob",
      "roles": ["developer"]
    },
    "request": {
      "path": ["admin", "users"]
    }
  }
}

拒绝规则可能评估为:

[
  "User bob missing role 'read'",
  "/admin endpoint requires 'admin' role"
]

您提供的示例策略可以重写为使用增量规则,如下所示:https://play.openpolicyagent.org/p/MYFFAVqMCu

如果您想了解更多信息,Styra Academy 是对 OPA 文档的重要补充资源。