2个版本
0.1.1 | 2024年5月30日 |
---|---|
0.1.0 | 2024年5月29日 |
0.0.1-beta.1 |
|
#907 在 身份验证
40KB
295 行
protect-salvo
为
salvo
提供端点保护的授权扩展。
要检查用户对特定服务的访问权限,您可以使用内置的 proc-macro
或手动方式。
此库还可以与第三方解决方案(例如 jwt-middlewares)集成。
如何使用
最简单的方法是声明一个具有以下签名的函数(此类已经为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步中定义的提取器将中间件添加到您的应用程序中
Router::with_path("/")
.hoop(GrantsLayer::with_extractor(extract).compat())
.push(Router::with_path("/endpoint").get(your_handler))
步骤2和3可以替换为自定义中间件或与其他库的集成。
- 以下是从示例中保护端点的方式
proc-macro
方式保护的示例
#[protect_salvo::protect("ROLE_ADMIN")]
#[handler]
async fn macro_secured() -> &'static str {
return "Hello, World!";
}
类似于ABAC的保护和自定义权威类型示例
以下是一个使用 ty
和 expr
属性的示例。但这些是独立的功能。
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"
}
依赖项
~19–32MB
~569K SLoC