pub struct AuthorizationMetadataManager { /* private fields */ }Expand description
Authorization metadata manager.
This struct manages ACL (Access Control List) operations by coordinating two metadata providers:
AuthorizationMetadataProvider: Persists ACL dataAuthenticationMetadataProvider: Validates USER subject existence
§Examples
ⓘ
use rocketmq_auth::AuthorizationMetadataManager;
use rocketmq_auth::AuthConfig;
// Create manager with configuration
let config = AuthConfig::default();
let manager = AuthorizationMetadataManager::new(config)?;
// Create ACL for a user
let acl = Acl::of("user:alice", SubjectType::User, policy);
manager.create_acl(acl).await?;
// Retrieve ACL
let user = User::of("alice");
if let Some(acl) = manager.get_acl(&user).await? {
println!("ACL found: {:?}", acl);
}
// Shutdown
manager.shutdown().await;Implementations§
Source§impl AuthorizationMetadataManager
impl AuthorizationMetadataManager
Sourcepub fn with_providers(
authorization_provider: Arc<LocalAuthorizationMetadataProvider>,
authentication_provider: Option<Arc<dyn AuthenticationMetadataProvider>>,
) -> Self
pub fn with_providers( authorization_provider: Arc<LocalAuthorizationMetadataProvider>, authentication_provider: Option<Arc<dyn AuthenticationMetadataProvider>>, ) -> Self
Create a new manager with the given providers.
§Arguments
authorization_provider- Provider for ACL storage operationsauthentication_provider- Optional provider for subject validation
§Examples
ⓘ
let auth_provider = Arc::new(LocalAuthorizationMetadataProvider::new(...));
let manager = AuthorizationMetadataManager::with_providers(
auth_provider,
None
);pub fn with_registry(registry: &ProviderRegistry) -> Self
Sourcepub fn new(config: AuthConfig) -> AuthServiceResult<Self>
pub fn new(config: AuthConfig) -> AuthServiceResult<Self>
Sourcepub async fn shutdown(&mut self)
pub async fn shutdown(&mut self)
Shutdown the manager and release resources.
Managers created from configuration close their providers. Managers borrowing a registry leave provider finalization to its runtime owner.
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:
- Validates the ACL structure
- Initializes default policy types
- Verifies the subject exists (if authentication provider is available)
- Checks if ACL already exists
- Creates or updates the ACL
§Arguments
acl- The ACL to create
§Errors
AuthFailureKind::NotFoundif subject doesn’t existAuthFailureKind::InvalidInputif ACL validation failsAuthFailureKind::InvalidInputif ACL already exists (and merge fails)AuthFailureKind::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
- Creates the ACL if it doesn’t exist, or merges with existing ACL
§Arguments
acl- The ACL with updated policies
§Errors
AuthFailureKind::NotFoundif subject doesn’t existAuthFailureKind::InvalidInputif ACL validation failsAuthFailureKind::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<()>
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 if resource specified)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 = User::of("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 AuthorizationMetadataManager
impl !UnwindSafe for AuthorizationMetadataManager
impl Freeze for AuthorizationMetadataManager
impl Send for AuthorizationMetadataManager
impl Sync for AuthorizationMetadataManager
impl Unpin for AuthorizationMetadataManager
impl UnsafeUnpin for AuthorizationMetadataManager
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
Mutably borrows from an owned value. Read more
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Pipes by value. This is generally the method you want to use. Read more
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,
Borrows
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,
Mutably borrows
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
Borrows
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
Mutably borrows
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
Borrows
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
Immutable access to the
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
Mutable access to the
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
Immutable access to the
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
Mutable access to the
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
Immutable access to the
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
Mutable access to the
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
Calls
.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
Calls
.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
Calls
.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
Calls
.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
Calls
.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
Calls
.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
Calls
.tap_deref() only in debug builds, and is erased in release
builds.