use gatehouse::*;
use uuid::Uuid;
#[derive(Debug, Clone)]
pub struct GroupPermission {
pub scope: String,
pub entity: String,
}
#[derive(Debug, Clone)]
pub struct OrganizationAuthorizationDetails {
pub id: Uuid,
pub permissions: Vec<GroupPermission>,
}
fn org_has_permission(
scope: String,
) -> Box<dyn Policy<OrganizationAuthorizationDetails, (), (), String>> {
PolicyBuilder::new(scope.clone())
.when(
move |org: &OrganizationAuthorizationDetails, _action, _resource, target_entity| {
org.permissions
.iter()
.any(|p| p.scope == scope && p.entity == *target_entity)
},
)
.build()
}
#[tokio::main]
async fn main() {
let mut checker = PermissionChecker::<OrganizationAuthorizationDetails, (), (), String>::new();
checker.add_policy(org_has_permission("edit_user_settings".to_string()));
checker.add_policy(org_has_permission("edit_org_settings".to_string()));
checker.add_policy(
PolicyBuilder::new("GlobalAdmin")
.subjects(|org: &OrganizationAuthorizationDetails| {
org.permissions.iter().any(|p| p.scope == "global_admin")
})
.build(),
);
let org1 = OrganizationAuthorizationDetails {
id: Uuid::new_v4(),
permissions: vec![GroupPermission {
scope: "edit_user_settings".to_string(),
entity: "org1".to_string(),
}],
};
let org2 = OrganizationAuthorizationDetails {
id: Uuid::new_v4(),
permissions: vec![GroupPermission {
scope: "edit_user_settings".to_string(),
entity: "org2".to_string(),
}],
};
let org3 = OrganizationAuthorizationDetails {
id: Uuid::new_v4(),
permissions: vec![],
};
let org4 = OrganizationAuthorizationDetails {
id: Uuid::new_v4(),
permissions: vec![GroupPermission {
scope: "global_admin".to_string(),
entity: "".to_string(),
}],
};
let result1 = checker
.evaluate_access(&org1, &(), &(), &"org1".to_string())
.await;
println!("Org1 on 'org1': {}", result1);
assert!(result1.is_granted());
let result2 = checker
.evaluate_access(&org2, &(), &(), &"org1".to_string())
.await;
println!("Org2 on 'org1': {}", result2);
assert!(!result2.is_granted());
let result3 = checker
.evaluate_access(&org2, &(), &(), &"org2".to_string())
.await;
println!("Org2 on 'org2': {}", result3);
assert!(result3.is_granted());
let result4 = checker
.evaluate_access(&org3, &(), &(), &"org1".to_string())
.await;
println!("Org3 on 'org1': {}", result4);
assert!(!result4.is_granted());
let result5 = checker
.evaluate_access(&org4, &(), &(), &"org1".to_string())
.await;
println!("Org4 on 'org1': {}", result5);
assert!(result5.is_granted());
}