#axum #security #permissions #grant #proc-macro

protect-axum

axum 提供保护端点的授权扩展

3个版本

0.1.2 2024年5月30日
0.1.1 2024年5月29日
0.1.0 2024年4月10日
0.0.1-beta.1 2024年4月10日

#605 in 身份验证

每月44次下载

MIT/Apache

47KB
281

protect-axum

protect-axum

axum 提供保护端点的授权扩展。

Crates.io Downloads Badge crates.io Documentation Apache 2.0 or MIT licensed

要检查用户对特定服务的访问权限,您可以使用内置的 proc-macro 或手动方式。

该库还可以与第三方解决方案(例如 jwt-middlewares)集成。

使用方法

  1. 声明自己的 权限提取器

最简单的方法是声明一个具有以下签名的函数(此类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. 使用第1步中定义的提取器将中间件添加到您的应用程序中
Router::new()
    .route("/endpoint", get(your_handler))
    .layer(GrantsLayer::with_extractor(extract));

步骤1和2可以替换为自定义中间件或与其他库的集成。

  1. 以下是一些示例,说明如何以任何方便的方式保护您的端点

proc-macro 方式保护示例

#[get("/secure")]
#[protect_axum::protect("OP_READ_SECURED_INFO")]
async fn macro_secured() -> &'static str {
    return "Hello, World!";
}
类似ABAC的保护和自定义权限类型示例

以下是一个使用 tyexpr 属性的示例。但这些是独立的功能。

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