Rego多属性规则编写:客户端账号端点权限校验实现
问题原因
- 层级访问错误:你当前的规则直接在
clientaccount_endpoints数组的第一层元素上取Action、Resource字段,但参考数据结构里这两个字段嵌套在每个账号对象的Endpoints子数组中,直接访问会拿到undefined,永远无法匹配成功。 - 大小写不匹配:参考数据中存储的
ClientId为首字母大写的Bob,输入参数传入的clientaccount为全小写的bob,直接做等值比较会判定为不相等。
正确规则代码
clientaccount_entitled { some i, j # 匹配目标客户端账号,统一转小写消除大小写差异影响 lower(data.clientaccount_endpoints[i].ClientId) == lower(input.clientaccount) # 遍历该账号下的端点列表,匹配权限 target_endpoint := data.clientaccount_endpoints[i].Endpoints[j] target_endpoint.Action == input.action target_endpoint.Resource == input.resource }
逻辑说明
- 声明两个索引
i、j,分别用于遍历外层的客户端账号数组、内层的端点权限数组 - 若业务侧保证账号ID大小写严格一致,可以去掉
lower()函数,直接做等值匹配即可 - 规则只要找到任意一条同时满足账号匹配、Action匹配、Resource匹配的记录,就会返回
true,符合权限校验的预期逻辑
内容的提问来源于stack exchange,提问作者Heath
相关产品推荐
相关产品推荐

