use cheetah_string::CheetahString;
use rocketmq_auth::authentication::enums::user_type::UserType;
use rocketmq_auth::authentication::manager::AuthenticationMetadataManager;
use rocketmq_auth::authentication::manager::AuthenticationMetadataManagerImpl;
use rocketmq_auth::authentication::model::user::User;
use rocketmq_auth::authentication::provider::local_authentication_metadata_provider::LocalAuthenticationMetadataProvider;
use rocketmq_auth::authentication::provider::AuthenticationMetadataProvider;
use rocketmq_auth::authorization::metadata_provider::local::LocalAuthorizationMetadataProvider;
use rocketmq_auth::config::AuthConfig;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
println!("=== Authentication Metadata Manager Example ===\n");
println!("1. Creating authentication and authorization providers...");
let mut auth_provider = LocalAuthenticationMetadataProvider::new();
let config_for_init = AuthConfig::default();
auth_provider.initialize(config_for_init, None).await?;
let authz_provider = LocalAuthorizationMetadataProvider::new();
println!("2. Creating AuthenticationMetadataManager...");
let manager = AuthenticationMetadataManagerImpl::new(Some(auth_provider), Some(authz_provider));
println!("\n3. Initializing default users from configuration...");
let config = AuthConfig {
init_authentication_user: CheetahString::from("admin:admin123"),
..Default::default()
};
manager.init_user(&config).await?;
println!(" ✓ Created super user 'admin' from simple format");
let config = AuthConfig {
init_authentication_user: CheetahString::from(
r#"{"username":"superadmin","password":"superpass","userType":"SUPER"}"#,
),
..Default::default()
};
manager.init_user(&config).await?;
println!(" ✓ Created super user 'superadmin' from JSON format");
let config = AuthConfig {
inner_client_authentication_credentials: CheetahString::from(
r#"{"accessKey":"innerClient","secretKey":"innerSecret"}"#,
),
..Default::default()
};
manager.init_user(&config).await?;
println!(" ✓ Created inner client user from SessionCredentials format");
println!("\n4. Creating a normal user...");
let normal_user = User::of_with_type("alice", "password123", UserType::Normal);
manager.create_user(normal_user).await?;
println!(" ✓ User 'alice' created");
println!("\n5. Retrieving user information...");
let retrieved_user: User = manager.get_user("alice").await?;
println!(" Username: {}", retrieved_user.username());
println!(" User Type: {:?}", retrieved_user.user_type());
println!(" User Status: {:?}", retrieved_user.user_status());
println!("\n6. Updating user...");
let mut updated_user = User::of("alice");
updated_user.set_password(CheetahString::from("new_password456"));
manager.update_user(updated_user).await?;
println!(" ✓ User 'alice' password updated");
println!("\n7. Listing all users...");
let all_users: Vec<User> = manager.list_users(None).await?;
println!(" Total users: {}", all_users.len());
for user in &all_users {
let user_type = user
.user_type()
.map(|t| format!("{:?}", t))
.unwrap_or_else(|| "None".to_string());
println!(" - {} (Type: {})", user.username(), user_type);
}
println!("\n8. Checking super user privileges...");
for username in &["admin", "alice", "nonexistent"] {
let is_super = manager.is_super_user(username).await?;
println!(" '{}' is super user: {}", username, is_super);
}
println!("\n9. Deleting user and related ACLs...");
manager.delete_user("alice").await?;
println!(" ✓ User 'alice' and related ACLs deleted");
let remaining_users: Vec<User> = manager.list_users(None).await?;
println!(" Remaining users: {}", remaining_users.len());
println!("\n=== Example completed successfully! ===");
Ok(())
}