#rocket #permissions #security #grant #authz #api-access

rocket-grants

用于保护端点的rocket的授权扩展

5个版本

0.5.0-rc.2 2022年6月20日
0.5.0-beta.1 2022年2月23日
0.1.4 2024年3月31日
0.1.3 2023年11月30日

#324 in 身份验证

Download history 5/week @ 2024-04-15 8/week @ 2024-05-20 10/week @ 2024-05-27 10/week @ 2024-06-10 2/week @ 2024-06-17 19/week @ 2024-07-01

每月364次下载
用于rocket-grants-proc-macro

MIT/Apache

35KB
149

rocket-grants

rocket-grants

用于授权请求的rocket的扩展

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

要检查用户对特定端点的访问权限,您可以使用内置的proc-macro或手动进行。

如何使用

  1. 声明您自己的权限提取函数

最简单的方法是声明一个具有以下签名的函数

// You can use custom type instead of String
async fn extract(req: &rocket::Request<'_>) -> Option<HashSet<String>>
  1. 使用第1步中定义的提取函数将公平性添加到您的应用程序中
    rocket::build().mount("/api", rocket::routes![endpoint])
         .attach(GrantsFairing::with_extractor_fn(|req| {
             Box::pin(extract(req)) // example with a separate async function `extract`, but you can write a closure right here
         }))

步骤1和2可以被与您自定义的公平性集成所替代。

  1. 以下示例中展示了保护端点的任何方便的方式

proc-macro保护方式的示例

#[rocket_grants::protect("OP_READ_SECURED_INFO")]
#[rocket::get("/")]
async fn macro_secured() -> &'static str {
   "ADMIN_RESPONSE"
}
类似于ABAC的保护方式和自定义权限类型示例

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

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

ty允许您使用自定义类型作为权限(然后需要配置公平性)。请参阅枚举角色示例

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

#[rocket_grants::protect("USER", expr = "user_id == user.id")]
#[rocket::post("/secure/<user_id>", data = "<user>")]
async fn role_macro_secured_with_params(user_id: i32, user: Json<User>) -> &'static str {
   "some secured info with parameters"
}

#[rocket_grants::protect(any("ADMIN", expr = "user.is_super_user()"))]
#[rocket::post("/secure/admin/<user_id>", data = "<user>")]
async fn admin_or_super_user(user_id: i32, user: Json<User>) -> &'static str {
   "some secured info with parameters"
}

手动保护方式的示例

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

#[rocket::get("/")]
async fn manual_secure(details: AuthDetails) -> &'static str {
    if details.has_authority("ROLE_ADMIN") {
        return "ADMIN_RESPONSE"
    }
    "OTHER_RESPONSE"
}

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

错误自定义

可以使用Rocket捕获器指定自定义错误响应。请参阅Rocket文档中的捕获器

您可以设置自定义响应

401 未授权 - 当您的提取器无法从请求中获取授权数据时。

403 禁止 - 当权限与端点指定的权限不匹配时。

支持的rocket版本

  • 对于rocket-grants: 0.1.*,支持的rocket版本是0.5.*

依赖项

~15–46MB
~781K SLoC