Gatehouse – a composable, async-friendly authorization policy framework in Rust
该文章介绍了一个名为 `Gatehouse` 的授权框架,使用 Rust 编写,支持异步操作。它是一个可组合的框架,融合了 RBAC、ABAC 和 ReBAC 等多种访问控制模式。`Gatehouse` 提供了策略组合功能,允许使用逻辑运算符构建复杂策略,并提供详细的评估追踪。核心组件包括 `Policy` Trait、`PermissionChecker` 和 `PolicyBuilder`,以及内置的 RBAC、ABAC 和 ReBAC 策略。
Gatehouse:Rust 中可组合的、异步友好的授权策略框架
一个灵活的授权库,结合了基于角色(RBAC)、基于属性(ABAC)和基于关系(ReBAC)的访问控制策略。
主要特性
- 多范式授权:支持 RBAC、ABAC 和 ReBAC 模式。
- 策略组合:使用逻辑运算符(
AND
、OR
、NOT
)组合策略。 - 详细的评估追踪:完整的决策追踪,便于调试和审计。
- 流畅的构建器 API:使用
PolicyBuilder
构建自定义策略。 - 类型安全:强类型资源/操作/上下文。
- 异步支持:构建时考虑了 async/await 支持。
核心组件
Policy
Trait
授权系统的基础:
#[async_trait]
trait Policy<Subject, Resource, Action, Context> {
async fn evaluate_access(
&self,
subject: &Subject,
action: &Action,
resource: &Resource,
context: &Context,
) -> PolicyEvalResult;
}
PermissionChecker
默认情况下,使用 OR
逻辑聚合多个策略(例如,RBAC、ABAC):如果任何策略授予访问权限,则授予权限。
let mut checker = PermissionChecker::new();
checker.add_policy(rbac_policy);
checker.add_policy(owner_policy);
// 检查是否授予访问权限
let result = checker.evaluate_access(&user, &action, &resource, &context).await;
if result.is_granted() {
// 允许访问
} else {
// 拒绝访问
}
PolicyBuilder
PolicyBuilder
提供了一个流畅的 API,通过链接 subject、action、resource 和 context 的谓词函数来构建自定义策略。 构建完成后,可以将策略添加到 [PermissionChecker
]。
let custom_policy = PolicyBuilder::<MySubject, MyResource, MyAction, MyContext>::new("CustomPolicy")
.subjects(|s| /* ... */)
.actions(|a| /* ... */)
.resources(|r| /* ... */)
.context(|c| /* ... */)
.when(|s, a, r, c| /* ... */)
.build();
内置策略
- RbacPolicy: 基于角色的访问控制
- AbacPolicy: 基于属性的访问控制
- RebacPolicy: 基于关系的访问控制
组合器
- AndPolicy:仅当所有内部策略都允许访问时才授予访问权限
- OrPolicy:如果任何内部策略允许访问,则授予访问权限
- NotPolicy:反转内部策略的决策
示例
请参阅 examples
目录,以获取以下内容的完整演示:
- 基于角色的访问控制 (
rbac_policy
) - 基于关系的访问控制 (
rebac_policy
) - 策略组合器 (
combinator_policy
)
运行示例:
cargo run --example rbac_policy
关于
一个灵活的授权库,结合了基于角色(RBAC)、基于属性(ABAC)和基于关系(ReBAC)的访问控制策略。
资源
Stars
Watchers
Forks
Releases 2
Packages 0
No packages published