pub struct AuthorizationMetadataManagerImpl { /* private fields */ }Expand description
Production implementation of Authorization Metadata Manager.
This struct manages ACL (Access Control List) operations by coordinating authorization and authentication metadata providers. It provides a unified, type-safe API with comprehensive validation for all ACL operations.
§Provider Coordination
- AuthorizationMetadataProvider: Handles ACL persistence (create, update, delete, query)
- AuthenticationMetadataProvider: Validates subject existence for USER subjects
§Examples
use rocketmq_auth::AuthorizationMetadataManagerImpl;
use rocketmq_auth::AuthConfig;
use rocketmq_auth::LocalAuthorizationMetadataProvider;
use std::sync::Arc;
// Create manager with local provider
let mut provider = LocalAuthorizationMetadataProvider::new();
provider.initialize(AuthConfig::default(), None)?;
let manager = AuthorizationMetadataManagerImpl::new(Arc::new(provider), None);
// Create ACL for a user
let acl = Acl::of("user:alice", SubjectType::User, policy);
manager.create_acl(acl).await?;
// Query ACL
let user = UserSubject::new("alice");
if let Some(acl) = manager.get_acl(&user).await? {
println!("ACL found: {:?}", acl);
}
// Cleanup
manager.shutdown().await;Implementations§
Source§impl AuthorizationMetadataManagerImpl
impl AuthorizationMetadataManagerImpl
Sourcepub fn new(
authorization_provider: Arc<LocalAuthorizationMetadataProvider>,
authentication_provider: Option<Arc<dyn AuthenticationMetadataProvider>>,
) -> Self
pub fn new( authorization_provider: Arc<LocalAuthorizationMetadataProvider>, authentication_provider: Option<Arc<dyn AuthenticationMetadataProvider>>, ) -> Self
Create a new Authorization Metadata Manager with providers.
§Arguments
authorization_provider- Provider for ACL storage (required, must be initialized)authentication_provider- Optional provider for subject validation
§Examples
let auth_provider = Arc::new(LocalAuthorizationMetadataProvider::new());
let manager = AuthorizationMetadataManagerImpl::new(auth_provider, None);pub fn with_registry(registry: &ProviderRegistry) -> Self
Sourcepub fn from_config(config: &AuthConfig) -> AuthServiceResult<Self>
pub fn from_config(config: &AuthConfig) -> AuthServiceResult<Self>
Create a manager from configuration.
This factory method instantiates providers based on configuration.
§Arguments
config- Authorization configuration
§Errors
Returns AuthFailureKind::InvalidConfiguration if:
- Provider initialization fails
- Required configuration is missing
- Configuration contains invalid values
pub async fn shutdown_until( &self, deadline: ShutdownDeadline, ) -> AuthServiceResult<()>
Sourcepub async fn create_acl(&self, acl: Acl) -> AuthServiceResult<()>
pub async fn create_acl(&self, acl: Acl) -> AuthServiceResult<()>
Create a new ACL.
This method performs the following steps:
- Validate ACL structure (subject, policies, entries, resources, actions)
- Initialize default policy types (sets CUSTOM if not specified)
- Verify subject exists (for USER type, via authentication provider)
- Check for existing ACL:
- If exists: merge policies and update
- If not: create new ACL
§Arguments
acl- The ACL to create
§Errors
AuthFailureKind::InvalidInputif ACL validation failsAuthFailureKind::NotFoundif subject doesn’t existAuthFailureKind::Unavailableif storage operation fails
§Examples
let acl = Acl::of("user:alice", SubjectType::User, policy);
manager.create_acl(acl).await?;Sourcepub async fn update_acl(&self, acl: Acl) -> AuthServiceResult<()>
pub async fn update_acl(&self, acl: Acl) -> AuthServiceResult<()>
Update an existing ACL.
This method:
- Validates the ACL structure
- Initializes default policy types
- Verifies the subject exists
- Merges with existing ACL or creates new if not found
§Arguments
acl- The ACL with updated policies
§Errors
AuthFailureKind::InvalidInputif ACL validation failsAuthFailureKind::NotFoundif subject doesn’t existAuthFailureKind::Unavailableif storage operation fails
§Examples
let mut acl = manager.get_acl(&user).await?.unwrap();
acl.add_policy(new_policy);
manager.update_acl(acl).await?;Sourcepub async fn delete_acl<S: Subject + Send + Sync>(
&self,
subject: &S,
) -> AuthServiceResult<()>
pub async fn delete_acl<S: Subject + Send + Sync>( &self, subject: &S, ) -> AuthServiceResult<()>
Delete an ACL for a subject.
This is a convenience method that deletes the entire ACL.
§Arguments
subject- The subject whose ACL should be deleted
§Errors
AuthFailureKind::NotFoundif subject doesn’t existAuthFailureKind::InvalidInputif ACL doesn’t existAuthFailureKind::Unavailableif storage operation fails
§Examples
let user = UserSubject::new("alice");
manager.delete_acl(&user).await?;Sourcepub async fn delete_acl_with_filter<S: Subject + Send + Sync>(
&self,
subject: &S,
policy_type: Option<PolicyType>,
resource: Option<&Resource>,
) -> AuthServiceResult<()>
pub async fn delete_acl_with_filter<S: Subject + Send + Sync>( &self, subject: &S, policy_type: Option<PolicyType>, resource: Option<&Resource>, ) -> AuthServiceResult<()>
Delete an ACL or specific policy entries.
This method provides fine-grained deletion:
- If
resourceis specified: deletes specific policy entry for that resource - If only
policy_typeis specified: deletes entire policy of that type - If neither specified: deletes entire ACL
§Arguments
subject- The subject whose ACL to modifypolicy_type- Optional policy type filter (defaults to CUSTOM)resource- Optional resource to delete from the policy
§Errors
AuthFailureKind::NotFoundif subject doesn’t existAuthFailureKind::InvalidInputif ACL doesn’t existAuthFailureKind::Unavailableif storage operation fails
§Examples
// Delete entire ACL
manager.delete_acl_with_filter(&user, None, None).await?;
// Delete a specific policy type
manager.delete_acl_with_filter(&user, Some(PolicyType::Custom), None).await?;
// Delete specific resource from policy
let resource = Resource::of_topic("test-topic");
manager.delete_acl_with_filter(&user, Some(PolicyType::Custom), Some(&resource)).await?;Sourcepub async fn get_acl<S: Subject + Send + Sync>(
&self,
subject: &S,
) -> AuthServiceResult<Option<Acl>>
pub async fn get_acl<S: Subject + Send + Sync>( &self, subject: &S, ) -> AuthServiceResult<Option<Acl>>
Get the ACL for a subject.
§Arguments
subject- The subject to query
§Returns
Ok(Some(Acl))if ACL existsOk(None)if no ACL foundErr(...)if operation fails
§Errors
AuthFailureKind::NotFoundif subject doesn’t existAuthFailureKind::Unavailableif storage operation fails
§Examples
let user = UserSubject::new("alice");
if let Some(acl) = manager.get_acl(&user).await? {
println!("Found ACL with {} policies", acl.policies().len());
}Sourcepub async fn list_acl(
&self,
subject_filter: Option<&str>,
resource_filter: Option<&str>,
) -> AuthServiceResult<Vec<Acl>>
pub async fn list_acl( &self, subject_filter: Option<&str>, resource_filter: Option<&str>, ) -> AuthServiceResult<Vec<Acl>>
List ACLs with optional filtering.
§Arguments
subject_filter- Optional subject name filter (substring match)resource_filter- Optional resource name filter (substring match)
§Returns
A vector of matching ACLs. Empty vector if no matches found.
§Errors
AuthFailureKind::Unavailableif storage operation fails
§Examples
// List all ACLs
let all_acls = manager.list_acl(None, None).await?;
// Filter by subject
let user_acls = manager.list_acl(Some("user:"), None).await?;
// Filter by resource
let topic_acls = manager.list_acl(None, Some("Topic:test")).await?;Auto Trait Implementations§
impl !RefUnwindSafe for AuthorizationMetadataManagerImpl
impl !UnwindSafe for AuthorizationMetadataManagerImpl
impl Freeze for AuthorizationMetadataManagerImpl
impl Send for AuthorizationMetadataManagerImpl
impl Sync for AuthorizationMetadataManagerImpl
impl Unpin for AuthorizationMetadataManagerImpl
impl UnsafeUnpin for AuthorizationMetadataManagerImpl
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.