#poem #security #permissions #grant #authz #api-access #jwt

poem-grants

poem 提供的授权扩展,以保护您的端点

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.12022年2月19日

#119 in 身份验证

Download history 9/week @ 2024-05-13 45/week @ 2024-05-20 245/week @ 2024-05-27 110/week @ 2024-06-03 83/week @ 2024-06-10 49/week @ 2024-06-17 59/week @ 2024-06-24 220/week @ 2024-07-01 390/week @ 2024-07-08 555/week @ 2024-07-15 63/week @ 2024-07-22 81/week @ 2024-07-29 70/week @ 2024-08-05 59/week @ 2024-08-12

每月下载 273 次

MIT/Apache

41KB
256

poem-grants

poem-grants

poem 提供授权扩展,以保护您的端点。

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

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

此库还可以与第三方解决方案或自定义中间件(如 jwt-auth 示例)集成。

注意:即使在 beta 标志下,它也是一个现成的库。然而,我计划很快准备一个包含更多功能的整个 *-grants 生态系统的重大更新。

如何使用

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

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

// You can use custom type instead of String
async fn extract(req: &poem::Request) -> poem::Result<HashSet<String>>
  1. 使用步骤 1 中定义的提取器将中间件添加到您的应用程序中
Route::new()
    .at("/endpoint", your_endpoint)
    .with(GrantsMiddleware::with_extractor(extract))

步骤 1 和 2 可以用自定义中间件或与其他库的集成替换。请参阅 jwt-auth 示例

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

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 的保护和自定义权限类型示例

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

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")
}

您可以在 Git 仓库文件夹和 文档 中找到更多 示例

支持的 poem 版本

  • 对于 poem-grants: 3.*,支持的 poem 版本是 3.*
  • 对于 poem-grants: 2.*,支持的 poem 版本是 2.*
  • 对于 poem-grants: 1.*,支持的 poem 版本是 1.*

依赖关系

~14–24MB
~364K SLoC