3个版本
0.1.2 | 2024年5月30日 |
---|---|
0.1.1 | 2024年5月29日 |
0.1.0 | 2024年4月10日 |
0.0.1-beta.1 |
|
#605 in 身份验证
每月44次下载
47KB
281 行
protect-axum
为
axum
提供保护端点的授权扩展。
要检查用户对特定服务的访问权限,您可以使用内置的 proc-macro
或手动方式。
该库还可以与第三方解决方案(例如 jwt-middlewares)集成。
使用方法
- 声明自己的 权限提取器
最简单的方法是声明一个具有以下签名的函数(此类Fn已实现)
use axum::extract::Request;
use axum::response::Response;
// You can use custom type instead of String
pub async fn extract(req: &mut Request) -> Result<HashSet<String>, Response>
- 使用第1步中定义的提取器将中间件添加到您的应用程序中
Router::new()
.route("/endpoint", get(your_handler))
.layer(GrantsLayer::with_extractor(extract));
步骤1和2可以替换为自定义中间件或与其他库的集成。
- 以下是一些示例,说明如何以任何方便的方式保护您的端点
proc-macro
方式保护示例
#[get("/secure")]
#[protect_axum::protect("OP_READ_SECURED_INFO")]
async fn macro_secured() -> &'static str {
return "Hello, World!";
}
类似ABAC的保护和自定义权限类型示例
以下是一个使用 ty
和 expr
属性的示例。但这些是独立的功能。
expr
允许您根据函数参数在宏中包含一些检查,它可以与权限通过使用 all
/any
结合使用。
ty
允许您使用自定义类型作为权限(然后中间件需要配置)。请参阅 枚举角色示例
use enums::Role::{self, ADMIN};
use dto::User;
#[get("/info/{user_id}")]
#[protect_axum::protect("ADMIN", expr = "user_id.into_inner() == user.id", ty = "Role")]
async fn macro_secured(Path(user_id): Path<i32>, Json(user): Json<User>) -> &'static str {
"some secured response"
}
#[post("/info/{user_id}")]
#[protect_axum::protect(any("ADMIN", expr = "user.is_super_user()"), ty = "Role")]
async fn admin_or_super_user(Path(user_id): Path<i32>, Json(user): Json<User>) -> &'static str {
"some secured response"
}
手动方式保护示例
use protect_axum::authorities::{AuthDetails, AuthoritiesCheck};
async fn manual_secure(details: AuthDetails) -> &'static str {
if details.has_authority(ROLE_ADMIN) {
return "ADMIN_RESPONSE";
}
"OTHER_RESPONSE"
}
您可以在git仓库文件夹和 文档 中找到更多 examples
依赖关系
~2.8–4MB
~75K SLoC