pub mod local;
use std::any::Any;
pub use local::LocalAuthorizationMetadataProvider;
use crate::authentication::model::subject::Subject;
use crate::authorization::model::acl::Acl;
use crate::config::AuthConfig;
use crate::AuthServiceResult;
#[allow(async_fn_in_trait)]
pub trait AuthorizationMetadataProvider: Send + Sync {
fn initialize(
&mut self,
config: AuthConfig,
metadata_service: Option<Box<dyn Any + Send + Sync>>,
) -> AuthServiceResult<()>;
fn shutdown(&mut self);
async fn create_acl(&self, acl: Acl) -> AuthServiceResult<()>;
async fn delete_acl<S: Subject + Send + Sync>(&self, subject: &S) -> AuthServiceResult<()>;
async fn update_acl(&self, acl: Acl) -> AuthServiceResult<()>;
fn get_acl<S: Subject + Send + Sync>(
&self,
subject: &S,
) -> impl std::future::Future<Output = AuthServiceResult<Option<Acl>>> + Send;
async fn list_acl(
&self,
subject_filter: Option<&str>,
resource_filter: Option<&str>,
) -> AuthServiceResult<Vec<Acl>>;
}
#[derive(Debug, Default)]
pub struct NoopMetadataProvider;
impl NoopMetadataProvider {
pub fn new() -> Self {
Self
}
}
impl AuthorizationMetadataProvider for NoopMetadataProvider {
fn initialize(
&mut self,
_config: AuthConfig,
_metadata_service: Option<Box<dyn Any + Send + Sync>>,
) -> AuthServiceResult<()> {
Ok(())
}
fn shutdown(&mut self) {
}
async fn create_acl(&self, _acl: Acl) -> AuthServiceResult<()> {
Ok(())
}
async fn delete_acl<S: Subject + Send + Sync>(&self, _subject: &S) -> AuthServiceResult<()> {
Ok(())
}
async fn update_acl(&self, _acl: Acl) -> AuthServiceResult<()> {
Ok(())
}
async fn get_acl<S: Subject + Send + Sync>(&self, _subject: &S) -> AuthServiceResult<Option<Acl>> {
Ok(None)
}
async fn list_acl(
&self,
_subject_filter: Option<&str>,
_resource_filter: Option<&str>,
) -> AuthServiceResult<Vec<Acl>> {
Ok(Vec::new())
}
}
#[cfg(test)]
mod tests {
use rocketmq_security_api::Action;
use super::*;
use crate::authentication::enums::subject_type::SubjectType;
use crate::authentication::model::user::User;
use crate::authorization::enums::decision::Decision;
use crate::authorization::enums::policy_type::PolicyType;
use crate::authorization::model::environment::Environment;
use crate::authorization::model::policy::Policy;
use crate::authorization::model::policy_entry::PolicyEntry;
use crate::authorization::model::resource::Resource;
#[tokio::test]
async fn test_noop_provider_initialization() {
let mut provider = NoopMetadataProvider::new();
let config = AuthConfig::default();
let result = provider.initialize(config, None);
assert!(result.is_ok());
}
#[tokio::test]
async fn test_noop_provider_create_acl() {
let provider = NoopMetadataProvider::new();
let resource = Resource::of_topic("test-topic");
let entry = PolicyEntry::of(
resource,
vec![Action::Pub],
Environment::of("192.168.1.1"),
Decision::Allow,
);
let policy = Policy::of_entries(PolicyType::Custom, vec![entry]);
let acl = Acl::of("user:test", SubjectType::User, policy);
let result = provider.create_acl(acl).await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_noop_provider_get_acl_returns_none() {
let provider = NoopMetadataProvider::new();
let user = User::of("test");
let result = provider.get_acl(&user).await;
assert!(result.is_ok());
assert!(result.unwrap().is_none());
}
#[tokio::test]
async fn test_noop_provider_list_acl_returns_empty() {
let provider = NoopMetadataProvider::new();
let result = provider.list_acl(None, None).await;
assert!(result.is_ok());
assert!(result.unwrap().is_empty());
}
#[tokio::test]
async fn test_noop_provider_update_acl() {
let provider = NoopMetadataProvider::new();
let resource = Resource::of_topic("test-topic");
let entry = PolicyEntry::of(
resource,
vec![Action::Pub],
Environment::of("192.168.1.1"),
Decision::Allow,
);
let policy = Policy::of_entries(PolicyType::Custom, vec![entry]);
let acl = Acl::of("user:test", SubjectType::User, policy);
let result = provider.update_acl(acl).await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_noop_provider_delete_acl() {
let provider = NoopMetadataProvider::new();
let user = User::of("test");
let result = provider.delete_acl(&user).await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_noop_provider_shutdown() {
let mut provider = NoopMetadataProvider::new();
provider.shutdown();
}
#[tokio::test]
async fn test_noop_provider_list_with_filters() {
let provider = NoopMetadataProvider::new();
let result = provider.list_acl(Some("user:test"), Some("Topic:test")).await;
assert!(result.is_ok());
assert!(result.unwrap().is_empty());
}
}