5个版本
0.5.0-rc.2 |
|
---|---|
0.5.0-beta.1 |
|
0.1.4 | 2024年3月31日 |
0.1.3 | 2023年11月30日 |
#324 in 身份验证
每月364次下载
用于rocket-grants-proc-macro
35KB
149 行
rocket-grants
用于授权请求的
rocket
的扩展
要检查用户对特定端点的访问权限,您可以使用内置的proc-macro
或手动进行。
如何使用
- 声明您自己的权限提取函数
最简单的方法是声明一个具有以下签名的函数
// You can use custom type instead of String
async fn extract(req: &rocket::Request<'_>) -> Option<HashSet<String>>
- 使用第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可以被与您自定义的公平性集成所替代。
- 以下示例中展示了保护端点的任何方便的方式
proc-macro
保护方式的示例
#[rocket_grants::protect("OP_READ_SECURED_INFO")]
#[rocket::get("/")]
async fn macro_secured() -> &'static str {
"ADMIN_RESPONSE"
}
类似于ABAC的保护方式和自定义权限类型示例
这是一个使用ty
和expr
属性的示例。但这些是独立的功能。
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