OPA实现ABAC授权:如何仅评估与HTTP请求相关的策略?
使用OPA实现ABAC的目标匹配(类似XACML的Target元素)
我正在试验用OPA保护HTTP REST API,想要实现ABAC授权。现在的需求是能否创建规则,仅评估与当前请求相关的策略——就像XACML中的Target元素那样。
现有策略
entity package
package entity default allow = false allow = true { input.method == "GET" input.path = ["entity", "1"] input.subject.location = 1 input.subject.role = "admin" input.resource.location = 2 }
user package
package user default allow = false allow = true { input.method == "GET" input.path = ["users", user] input.user = user }
决策请求
{ "input": { "method": "GET", "path": [ "entity", "1" ], "subject": { "location": 1, "role": "admin" }, "resource": { "location": 2 } } }
当前结果
{ "result": { "entity": { "allow": true }, "user": { "allow": false } } }
期望结果
{ "allow": true }
在此示例中,决策请求仅包含与entity策略相关的数据。我想知道是否可以配置OPA或Rego策略,无需在决策请求中指定策略,仅评估相关策略。
解决方案
方式一:根Package统一路由匹配
创建一个根Package(如package authz),根据请求的path、method等属性动态匹配对应的子Package规则,最终返回统一的allow结果。这种方式能直接跳过无关Package的评估,效率更高。
示例根规则:
package authz default allow = false # 匹配entity类请求,评估entity包的权限规则 allow = entity.allow { input.path[0] == "entity" } # 匹配user类请求,评估user包的权限规则 allow = user.allow { input.path[0] == "users" }
之后直接查询data.authz.allow,OPA会自动根据请求路径前缀触发对应子Package的规则评估,返回单个allow结果,完全符合你的期望。
方式二:子Package内置目标匹配条件
给每个子Package的allow规则添加前置的目标匹配逻辑,确保只有请求符合该Package的场景时,才会执行后续的权限判断。
修改后的entity package:
package entity default allow = false allow = true { # 前置目标匹配:仅处理path前缀为entity的请求 input.path[0] == "entity" input.method == "GET" input.path = ["entity", "1"] input.subject.location = 1 input.subject.role = "admin" input.resource.location = 2 }
修改后的user package:
package user default allow = false allow = true { # 前置目标匹配:仅处理path前缀为users的请求 input.path[0] == "users" input.method == "GET" input.path = ["users", user] input.user = user }
再创建一个根Package聚合结果:
package authz allow = true { entity.allow == true } else = true { user.allow == true } else = false
查询data.authz.allow即可得到统一的授权结果,且只有匹配目标条件的子Package规则会被实际评估。
内容的提问来源于stack exchange,提问作者goatrenz
相关产品推荐
相关产品推荐

