#actix-web-middleware #middleware #actix-web #opa #http-request #derive-deserialize #openpolicyagent

actix-web-middleware-opa

用于 Open Policy Agent (OPA) 验证的 actix-web 中间件

2 个版本

使用旧的 Rust 2015

0.1.1 2018年12月18日
0.1.0 2018年12月11日

#7#opa

24 每月下载

MIT 许可证

17KB
285

actix-web-middleware-opa

Build Status License Documentation

Open Policy Agent (openpolicyagent/OPA) 对 actix-web 应用程序的中间件。

此中间件会对 Open Policy Agent 实例进行策略检查,针对传入的 HTTP 请求。

策略检查请求和响应都是通用的。

流程

Components

示例

考虑以下请求

curl -XGET -H 'Authorization: Bearer 123123123' http://localhost:8080/order/item/1

这需要转换为对 OPA 的 JSON 调用

{
  "input" : {
    "token"  : "123123123",
    "method" : "GET",
    "path"   : ["order", "item", "1"]
  }
}

我们将其表示为两个实现 Serialize 的 Rust 结构体

#[derive(Serialize)]
struct PolicyRequest {
    input: PolicyRequestInput,
}

#[derive(Serialize)]
struct PolicyRequestInput {
    token: String,
    method: String,
    path: Vec<String>,
}

预期的响应是一个 JSON 对象

{
   "result" : {
      "allow" : true
   }
}

我们将其表示为两个实现 Deserialize 的 Rust 结构体

#[derive(Deserialize)]
struct PolicyResponse {
    input: PolicyResponseResult,
}

#[derive(Deserialize)]
struct PolicyResponseResult {
    allow: bool,
}

最后,我们必须实现 OPARequest<S> 特性,以便


    impl<S> OPARequest<S> for PolicyRequest {
        fn from_http_request(_req: &HttpRequest<S>) -> Result<Self, String> {
            // This needs to be constructured from _req
            Ok(PolicyRequest {
              input: PolicyRequestInput {
                token: "123".into(),
                method: "GET",
                path: vec!["order", "item", "1"],
              }
            })
        }
    }
    type VerifierMiddleware = PolicyVerifier<PolicyRequest, PolicyResponse>;

依赖关系

~28MB
~529K SLoC