use rocketmq_auth::authentication::enums::subject_type::SubjectType;
use rocketmq_auth::authentication::model::user::User;
use rocketmq_auth::authorization::enums::decision::Decision;
use rocketmq_auth::authorization::enums::policy_type::PolicyType;
use rocketmq_auth::authorization::metadata_provider::AuthorizationMetadataProvider;
use rocketmq_auth::authorization::metadata_provider::NoopMetadataProvider;
use rocketmq_auth::authorization::model::acl::Acl;
use rocketmq_auth::authorization::model::environment::Environment;
use rocketmq_auth::authorization::model::policy::Policy;
use rocketmq_auth::authorization::model::policy_entry::PolicyEntry;
use rocketmq_auth::authorization::model::resource::Resource;
use rocketmq_auth::config::AuthConfig;
use rocketmq_common::common::action::Action;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== AuthorizationMetadataProvider Example ===\n");
let mut provider = NoopMetadataProvider::new();
let config = AuthConfig::default();
provider.initialize(config, None)?;
println!("✓ Provider initialized\n");
let acl = create_sample_acl();
provider.create_acl(acl.clone()).await?;
println!("✓ ACL created for user: user:alice\n");
let user = User::of("alice");
match provider.get_acl(&user).await? {
Some(acl) => {
println!("✓ Found ACL:");
println!(" Subject: {}", acl.subject_key());
println!(" Policies: {} policy(ies)\n", acl.policies().len());
}
None => println!("✗ ACL not found\n"),
}
let all_acls: Vec<Acl> = provider.list_acl(None, None).await?;
println!("✓ Total ACLs: {}\n", all_acls.len());
println!("Filtering examples:");
let user_acls: Vec<Acl> = provider.list_acl(Some("user:"), None).await?;
println!(" - ACLs for users: {}", user_acls.len());
let topic_acls: Vec<Acl> = provider.list_acl(None, Some("Topic:")).await?;
println!(" - ACLs for topics: {}", topic_acls.len());
let filtered: Vec<Acl> = provider.list_acl(Some("user:alice"), Some("Topic:orders")).await?;
println!(" - ACLs for user:alice on Topic:orders: {}\n", filtered.len());
let mut updated_acl = acl;
let new_resource = Resource::of_topic("new-topic");
let new_entry = PolicyEntry::of(
new_resource,
vec![Action::Sub],
Environment::of("10.0.0.0/8"),
Decision::Allow,
);
let new_policy = Policy::of_entries(PolicyType::Custom, vec![new_entry]);
updated_acl.update_policy(new_policy);
provider.update_acl(updated_acl).await?;
println!("✓ ACL updated\n");
provider.delete_acl(&user).await?;
println!("✓ ACL deleted\n");
provider.shutdown();
println!("✓ Provider shut down\n");
println!("=== Example completed successfully ===");
Ok(())
}
fn create_sample_acl() -> Acl {
let order_topic = Resource::of_topic("orders-topic");
let payment_topic = Resource::of_topic("payments");
let pub_actions = vec![Action::Pub];
let sub_actions = vec![Action::Sub];
let internal_network = Environment::of("192.168.0.0/16");
let order_entry = PolicyEntry::of(
order_topic,
pub_actions.clone(),
internal_network.clone(),
Decision::Allow,
);
let payment_entry = PolicyEntry::of(
payment_topic,
sub_actions.clone(),
internal_network.clone(),
Decision::Allow,
);
let policy = Policy::of_entries(PolicyType::Custom, vec![order_entry, payment_entry]);
Acl::of("user:alice", SubjectType::User, policy)
}