2个版本

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

#907身份验证

MIT/Apache

40KB
295

protect-salvo

protect-salvo

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

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

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

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

如何使用

  1. tower-compat 功能添加到您的 Cargo.toml 中的 salvo 依赖项中

  2. 声明您自己的 权威提取器

最简单的方法是声明一个具有以下签名的函数(此类已经为Fn实现)

use salvo::prelude::*;

// You can use custom type instead of String
// It requires to use hyper's `Request` & `Response` types, because integration is based on `tower`
pub async fn extract(req: &mut salvo::hyper::Request<ReqBody>) -> Result<HashSet<String>, salvo::hyper::Response<ResBody>>
  1. 使用第1步中定义的提取器将中间件添加到您的应用程序中
Router::with_path("/")
    .hoop(GrantsLayer::with_extractor(extract).compat())
    .push(Router::with_path("/endpoint").get(your_handler))

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

  1. 以下是从示例中保护端点的方式

proc-macro 方式保护的示例

#[protect_salvo::protect("ROLE_ADMIN")]
#[handler]
async fn macro_secured() -> &'static str {
    return "Hello, World!";
}
类似于ABAC的保护和自定义权威类型示例

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

expr 允许您根据函数参数在宏中包含一些检查,它可以通过使用 all/any 与权威结合使用。

ty 允许您为权威使用自定义类型(然后中间件需要配置)。

use enums::Role::{self, ADMIN};
use dto::User;

#[post("/info/{user_id}")]
#[protect_salvo::protect(any("ADMIN", expr = "user.is_super_user()"), ty = "Role")]
async fn admin_or_super_user(user: User) -> &'static str {
    "some secured response"
}

手动方式保护的示例

use protect_salvo::authorities::{AuthDetails, AuthoritiesCheck};

async fn manual_secure(details: AuthDetails) -> &'static str {
    if details.has_authority(ROLE_ADMIN) {
        return "ADMIN_RESPONSE";
    }
    "OTHER_RESPONSE"
}

您可以在git仓库文件夹中找到更多 examples文档

依赖项

~19–32MB
~569K SLoC