#actix-web-middleware #authorization #oso #actix-middleware

actix-web-middleware-oso

基于 Oso 的 actix-web 授权中间件

1 个不稳定版本

0.1.0 2022年3月18日

#1115 in HTTP 服务器

MIT/Apache

21KB
145

Oso 授权的 Actix 中间件

actix-web 中间件,用于 Oso 授权框架。

ci crates.io Documentation Apache 2.0 or MIT licensed Dependency Status

安装

actix-web-middleware-oso 添加为依赖项

[dependencies]
actix-web-middleware-oso = "0.1.0"
actix-web = "4"
oso = "0.26.0"

用法

创建一个运行您的 Oso 授权逻辑的函数。

async fn authorize(req: ServiceRequest, oso: Oso) -> Result<ServiceRequest, Error> {
    let action = req.method().to_string().to_uppercase();
    let resource = req.path();

    match oso.is_allowed("_actor", action, resource) {
        Ok(true) => Ok(req),
        _ => Err(ErrorUnauthorized("not allowed")),
    }
}

初始化 Oso 和中间件,并使用 wrap 将其添加到您的 actix App 中。

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        let mut oso = Oso::new();
        oso.load_str(r#"allow(_actor, action, resource) if action = "GET" and resource.starts_with("/ok/");"#)
            .unwrap();
        let authz = OsoMiddleware::new(oso, authorize);
        App::new()
            .wrap(middleware::Logger::default())
            .wrap(authz)
            .default_service(web::to(|| HttpResponse::Ok()))
    })
        .bind("127.0.0.1:8080")?
        .run()
        .await
}

此外,您的初始化 Oso 可以通过 提取器 供处理器使用

#[get("/hello")]
async fn hello(oso: ExtractedOso) -> impl Responder {
    let user = User {
        name: "alice".to_string(),
    };

    if oso.is_allowed(user, "action", "resource").unwrap() {
        HttpResponse::Ok().body("cool cool")
    } else {
        HttpResponse::Unauthorized().body("nope, sorry")
    }
}

许可证

本项目受以下任一许可证的许可:

任选其一。

依赖项

~15–27MB
~494K SLoC