本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
示例 3:使用 OPA 和 Rego 对 RBAC 和 ABAC 进行多租户访问控制
要增强上一节中的 RBAC 示例,您可以向用户添加属性。
此示例包含与上一个示例相同的角色,但添加了用户属性account_lockout_flag。这是用户特定的属性,与任何特定角色均无关联。您可以使用之前在本示例中使用的 RBAC 外部数据:
{ "roles": { "tenant_a": { "all_access_role": ["viewData", "updateData"] }, "tenant_b": { "update_data_role": ["updateData"], "view_data_role": ["viewData"] } } }
可以将account_lockout_flag用户属性作为用户 Bob 的 OPA 查询输入的一部分传递给数据服务:/viewData/tenant_a
{ "tenant_id": "tenant_a", "role": "all_access_role", "path": ["viewData", "tenant_a"], "method": "GET", "account_lockout_flag": "true" }
查询访问决策的规则与前面的示例类似,但包括另外一行用于检查该account_lockout_flag属性:
default allowViewData = false allowViewData = true { input.method == "GET" input.path = ["viewData", tenant_id] input.tenant_id == tenant_id role_permissions := data.roles[input.tenant_id][input.role][_] contains(role_permissions, "viewData") input.account_lockout_flag == "false" }
此查询返回的授权决定为false。这是因为true适用于 Bob,而 Rego 规则allowViewData拒绝访问,尽管 Bob 的角色和租户account_lockout_flag attribute是正确的。