rs-tenant 0.4.0

Multi-tenant RBAC authorization engine for Rust
Documentation
use futures::executor::block_on;
use rs_tenant::{
    AccessDecision, AuthSubject, EngineBuilder, GrantScope, MembershipStatus, MemorySource,
    Permission, PrincipalId, RoleId, ScopePath, ScopedAccessRequest, TenantId, TenantStatus,
};

fn main() -> rs_tenant::Result<()> {
    block_on(async {
        let tenant = TenantId::parse("tenant_demo")?;
        let principal = PrincipalId::parse("user_demo")?;
        let role = RoleId::parse("store_reader")?;
        let permission = Permission::parse("invoice:read")?;
        let root = ScopePath::parse("agent/1")?;
        let target = ScopePath::parse("agent/1/store/9")?;

        let source = MemorySource::new();
        source.set_tenant_status(tenant.clone(), TenantStatus::Active);
        source.set_membership_status(tenant.clone(), principal.clone(), MembershipStatus::Active);
        source.add_role_assignment(
            tenant.clone(),
            principal.clone(),
            role.clone(),
            GrantScope::paths(vec![root])?,
        );
        source.add_role_permission(tenant.clone(), role, permission.clone());

        let engine = EngineBuilder::new(source).build();
        let decision = engine
            .can_access_scope(ScopedAccessRequest {
                subject: AuthSubject::new(tenant, principal),
                permission,
                target,
            })
            .await?;

        assert_eq!(decision, AccessDecision::Allow);
        Ok(())
    })
}