use std::sync::Arc;
use rocketmq_auth::Acl;
use rocketmq_auth::AclAuthorizationHandler;
use rocketmq_auth::AuthConfig;
use rocketmq_auth::AuthorizationDecision;
use rocketmq_auth::AuthorizationHandlerChain;
use rocketmq_auth::AuthorizationMetadataProvider;
use rocketmq_auth::DefaultAuthorizationContext;
use rocketmq_auth::LocalAuthorizationMetadataProvider;
use rocketmq_auth::Policy;
use rocketmq_auth::PolicyDecision;
use rocketmq_auth::PolicyResource;
use rocketmq_auth::SubjectType;
use rocketmq_auth::User;
use rocketmq_security_api::Action;
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
#[tokio::main]
async fn main() -> Result<()> {
println!("=== ACL Authorization Handler Example ===\n");
println!("1. Creating local authorization metadata provider...");
let mut provider = LocalAuthorizationMetadataProvider::new();
provider.initialize(AuthConfig::default(), None)?;
let provider = Arc::new(provider);
println!("2. Setting up ACLs for users...\n");
let alice = User::of("alice");
let alice_resource = PolicyResource::of_topic("orders");
let alice_policy = Policy::of(
vec![alice_resource.clone()],
vec![Action::Pub],
None,
PolicyDecision::Allow,
);
let alice_acl = Acl::of_subject_and_policy(&alice, alice_policy);
provider.create_acl(alice_acl).await?;
println!(" ✓ Created ACL for Alice: ALLOW Pub on topic 'orders'");
let bob = User::of("bob");
let bob_resource = PolicyResource::of_topic("secrets");
let bob_policy = Policy::of(
vec![bob_resource.clone()],
vec![Action::All],
None,
PolicyDecision::Deny,
);
let bob_acl = Acl::of_subject_and_policy(&bob, bob_policy);
provider.create_acl(bob_acl).await?;
println!(" ✓ Created ACL for Bob: DENY All on topic 'secrets'");
let charlie = User::of("charlie");
let charlie_resource = PolicyResource::of_topic("notifications");
let charlie_policy = Policy::of(
vec![charlie_resource.clone()],
vec![Action::Sub],
None,
PolicyDecision::Allow,
);
let charlie_acl = Acl::of_subject_and_policy(&charlie, charlie_policy);
provider.create_acl(charlie_acl).await?;
println!(" ✓ Created ACL for Charlie: ALLOW Sub on topic 'notifications'\n");
println!("3. Creating ACL authorization handler...");
let acl_handler = Arc::new(AclAuthorizationHandler::new(provider.clone()));
println!("4. Setting up authorization handler chain...\n");
let chain = AuthorizationHandlerChain::new().add_handler(acl_handler);
println!("5. Testing authorization scenarios:\n");
println!(" Scenario 1: Alice publishing to 'orders'");
let context1 = DefaultAuthorizationContext::of(
"alice",
SubjectType::User,
alice_resource.clone(),
Action::Pub,
"192.168.1.100",
);
match chain.handle(&context1).await {
Ok(AuthorizationDecision::Allow) => println!(" ✅ Authorization GRANTED\n"),
Ok(AuthorizationDecision::Deny(denial)) => {
println!(" ❌ Authorization DENIED: {:?}\n", denial)
}
Err(e) => println!(" ⚠️ Authorization evaluation FAILED: {}\n", e),
}
println!(" Scenario 2: Alice subscribing to 'orders' (no SUB permission)");
let context2 = DefaultAuthorizationContext::of(
"alice",
SubjectType::User,
alice_resource.clone(),
Action::Sub,
"192.168.1.100",
);
match chain.handle(&context2).await {
Ok(AuthorizationDecision::Allow) => println!(" ✅ Authorization GRANTED\n"),
Ok(AuthorizationDecision::Deny(denial)) => {
println!(" ❌ Authorization DENIED: {:?}\n", denial)
}
Err(e) => println!(" ⚠️ Authorization evaluation FAILED: {}\n", e),
}
println!(" Scenario 3: Bob accessing 'secrets' (DENY policy)");
let context3 =
DefaultAuthorizationContext::of("bob", SubjectType::User, bob_resource.clone(), Action::Pub, "10.0.0.50");
match chain.handle(&context3).await {
Ok(AuthorizationDecision::Allow) => println!(" ✅ Authorization GRANTED\n"),
Ok(AuthorizationDecision::Deny(denial)) => {
println!(" ❌ Authorization DENIED: {:?}\n", denial)
}
Err(e) => println!(" ⚠️ Authorization evaluation FAILED: {}\n", e),
}
println!(" Scenario 4: Charlie subscribing to 'notifications'");
let context4 = DefaultAuthorizationContext::of(
"charlie",
SubjectType::User,
charlie_resource.clone(),
Action::Sub,
"172.16.0.10",
);
match chain.handle(&context4).await {
Ok(AuthorizationDecision::Allow) => println!(" ✅ Authorization GRANTED\n"),
Ok(AuthorizationDecision::Deny(denial)) => {
println!(" ❌ Authorization DENIED: {:?}\n", denial)
}
Err(e) => println!(" ⚠️ Authorization evaluation FAILED: {}\n", e),
}
println!(" Scenario 5: Unknown user 'dave' (no ACL configured)");
let context5 = DefaultAuthorizationContext::of(
"dave",
SubjectType::User,
PolicyResource::of_topic("any-topic"),
Action::Pub,
"203.0.113.42",
);
match chain.handle(&context5).await {
Ok(AuthorizationDecision::Allow) => println!(" ✅ Authorization GRANTED\n"),
Ok(AuthorizationDecision::Deny(denial)) => {
println!(" ❌ Authorization DENIED: {:?}\n", denial)
}
Err(e) => println!(" ⚠️ Authorization evaluation FAILED: {}\n", e),
}
println!("=== Example completed successfully ===");
Ok(())
}