1 个不稳定版本
0.1.0 | 2022年3月18日 |
---|
#1115 in HTTP 服务器
21KB
145 行
Oso 授权的 Actix 中间件
actix-web
中间件,用于 Oso 授权框架。
安装
将 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")
}
}
许可证
本项目受以下任一许可证的许可:
- Apache 许可证 2.0 版,(LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
依赖项
~15–27MB
~494K SLoC