9 个版本 (稳定版)
3.0.1 | 2024年5月29日 |
---|---|
3.0.0 | 2024年3月31日 |
2.0.1 | 2024年3月4日 |
2.0.0 | 2024年1月9日 |
1.0.0-beta.1 | 2022年2月19日 |
#119 in 身份验证
每月下载 273 次
41KB
256 行
poem-grants
为
poem
提供授权扩展,以保护您的端点。
要检查用户对特定服务的访问权限,您可以使用内置的 proc-macro
或手动方式。
此库还可以与第三方解决方案或自定义中间件(如 jwt-auth
示例)集成。
注意:即使在 beta
标志下,它也是一个现成的库。然而,我计划很快准备一个包含更多功能的整个 *-grants
生态系统的重大更新。
如何使用
- 声明自己的 权限提取器
最简单的方法是声明一个具有以下签名的函数(该特质已为此类 Fn 实现)
// You can use custom type instead of String
async fn extract(req: &poem::Request) -> poem::Result<HashSet<String>>
- 使用步骤 1 中定义的提取器将中间件添加到您的应用程序中
Route::new()
.at("/endpoint", your_endpoint)
.with(GrantsMiddleware::with_extractor(extract))
步骤 1 和 2 可以用自定义中间件或与其他库的集成替换。请参阅 jwt-auth 示例
- 以下是一些示例,说明如何以任何方便的方式保护您的端点
proc-macro
方式保护示例
use poem::{Response, http::StatusCode};
#[poem_grants::protect("OP_READ_SECURED_INFO")]
#[poem::handler]
async fn macro_secured() -> Response {
Response::builder().status(StatusCode::OK).body("ADMIN_RESPONSE")
}
或针对 poem-openapi
use poem_openapi::{OpenApi, payload::PlainText};
struct Api;
#[poem_grants::open_api] // It's important to keep above of `OpenApi`
#[OpenApi]
impl Api {
#[protect("OP_READ_ADMIN_INFO")]
#[oai(path = "/admin", method = "get")]
async fn macro_secured(&self) -> PlainText<String> {
PlainText("ADMIN_RESPONSE".to_string())
}
}
类似于 ABAC 的保护和自定义权限类型示例
以下是一个使用 ty
和 expr
属性的示例。但这些是独立的功能。
expr
允许您根据函数参数在宏中包含一些检查,可以使用 all
/any
将其与权限结合使用。
ty
允许您为权限使用自定义类型(然后需要配置中间件)。请参阅一个 枚举角色示例
use poem::{Response, http::StatusCode, web};
use enums::Role::{self, ADMIN};
use dto::User;
#[poem_grants::protect("ADMIN", expr = "*user_id == user.id", ty = "Role")]
#[poem::handler]
async fn macro_secured(user_id: web::Path<i32>, user: web::Data<User>) -> Response {
Response::builder().status(StatusCode::OK).body("some secured response")
}
#[poem_grants::protect(any("ADMIN", expr = "user.is_super_user()"), ty = "Role")]
#[poem::handler]
async fn admin_or_super_user(user_id: web::Path<i32>, user: web::Data<User>) -> Response {
Response::builder().status(StatusCode::OK).body("some secured response")
}
手动保护示例
use poem::{Response, http::StatusCode};
use poem_grants::authorities::{AuthDetails, AuthoritiesCheck};
#[poem::handler]
async fn manual_secure(details: AuthDetails) -> Response {
if details.has_authority("ROLE_ADMIN") {
return Response::builder().status(StatusCode::OK).body("ADMIN_RESPONSE");
}
Response::builder().status(StatusCode::OK).body("OTHER_RESPONSE")
}
支持的 poem
版本
- 对于
poem-grants: 3.*
,支持的poem
版本是3.*
- 对于
poem-grants: 2.*
,支持的poem
版本是2.*
- 对于
poem-grants: 1.*
,支持的poem
版本是1.*
依赖关系
~14–24MB
~364K SLoC