dgp.filter.http.opa 过滤器通过 Rego 策略将授权决策委托给 Open Policy Agent (OPA)。该过滤器评估每个 HTTP 请求并根据 Rego 策略决定是否允许或拒绝请求。策略通过内联 Rego 模块加载,并使用 OPA 的内置查询引擎进行评估。
policy 读取 Rego 模块源码字符串。entrypoint 读取 Rego 查询字符串。input 对象(见下),并评估该查询。true,则放行请求;否则拒绝请求。目前过滤器不支持:外部文件或 URI 加载、自定义拒绝状态码或返回自定义错误体等。
将过滤器添加到 HTTP 连接管理器的 http_filters 列表中:
filters:
- name: dgp.filter.httpconnectionmanager
config:
route_config:
# ... 你的路由
http_filters:
- name: dgp.filter.http.opa
config:
policy: |
package http.authz
default allow = false
allow {
input.method == "GET"
input.path == "/status"
}
entrypoint: "data.http.authz.allow"
# HTTP proxy 过滤器应该在OPA 过滤器之后
- name: dgp.filter.http.proxy
config:
# ... proxy config
policy(字符串,必填)rego.Module("policy.rego", policy) 加载。string(建议使用 YAML 多行格式 |)。entrypoint(字符串,必填)rego.Query(...) 的 Rego 查询字符串,应为合法查询,如 data.<package>.<rule>(如 data.http.authz.allow)。string。true,则请求放行。true),请求被拒绝。input)过滤器将 HTTP 请求转换为以下键值对(与当前实现一致,策略编写时请进行空值检查):
input.method # 请求方法,字符串
input.path # URL Path,字符串
input.headers # map[string][]string
input.client_ip # 字符串
input.query # map[string][]string(URL 查询参数)
input.host # 字符串
input.remote_addr # 字符串
input.user_agent # 字符串
input.route # 路由条目对象(结构可能变化)
input.api # API 对象(结构可能变化)
input.params # 路由参数 map
1)仅允许 GET /status
- name: dgp.filter.http.opa
config:
policy: |
package http.authz
default allow = false
allow { input.method == "GET"; input.path == "/status" }
entrypoint: "data.http.authz.allow"
2)基于请求头校验
- name: dgp.filter.http.opa
config:
policy: |
package http.authz
default allow = false
allow {
input.headers["x-api-key"][0] == "secret"
}
entrypoint: "data.http.authz.allow"
true 会被视为放行;对象(如 {allow: true})不会被特殊处理。data.http.authz.allow),并确保策略在给定的 input 下返回 true。opa eval 本地验证 Rego 语法。headers/query,确保路径和方法匹配。