Skip to main content

AuthStorage

Trait AuthStorage 

Source
pub trait AuthStorage: Send + Sync {
Show 20 methods // Required methods fn store_token<'life0, 'life1, 'async_trait>( &'life0 self, token: &'life1 AuthToken, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn get_token<'life0, 'life1, 'async_trait>( &'life0 self, token_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<AuthToken>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn get_token_by_access_token<'life0, 'life1, 'async_trait>( &'life0 self, access_token: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<AuthToken>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn update_token<'life0, 'life1, 'async_trait>( &'life0 self, token: &'life1 AuthToken, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn delete_token<'life0, 'life1, 'async_trait>( &'life0 self, token_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn list_user_tokens<'life0, 'life1, 'async_trait>( &'life0 self, user_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<AuthToken>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn store_session<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, session_id: &'life1 str, data: &'life2 SessionData, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait; fn get_session<'life0, 'life1, 'async_trait>( &'life0 self, session_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<SessionData>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn delete_session<'life0, 'life1, 'async_trait>( &'life0 self, session_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn list_user_sessions<'life0, 'life1, 'async_trait>( &'life0 self, user_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<SessionData>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn count_active_sessions<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<u64>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait; fn store_kv<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, key: &'life1 str, value: &'life2 [u8], ttl: Option<Duration>, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait; fn get_kv<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn delete_kv<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn cleanup_expired<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait; // Provided methods fn store_tokens_bulk<'life0, 'life1, 'async_trait>( &'life0 self, tokens: &'life1 [AuthToken], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn delete_tokens_bulk<'life0, 'life1, 'async_trait>( &'life0 self, token_ids: &'life1 [String], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn store_sessions_bulk<'life0, 'life1, 'async_trait>( &'life0 self, sessions: &'life1 [(String, SessionData)], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn delete_sessions_bulk<'life0, 'life1, 'async_trait>( &'life0 self, session_ids: &'life1 [String], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn list_kv_keys<'life0, 'life1, 'async_trait>( &'life0 self, _prefix: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<String>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... }
}
Expand description

Trait for authentication data storage backends.

All persistence in AuthFramework goes through this trait — tokens, sessions, and arbitrary key-value data. Implement it to plug in a custom database while keeping the rest of the framework unchanged.

§Provided Implementations

BackendTypeFeature flag
In-memory (DashMap)MemoryStorage(always available)
PostgreSQLPostgresStoragepostgres-storage
MySQLMySqlStoragemysql-storage
Redis[RedisStorage]redis-storage
SQLiteSqliteStoragesqlite-storage
Encrypted wrapperEncryptedStorage(always available)

§Implementing This Trait

Custom storage backends must:

  1. Be thread-safe — the trait requires Send + Sync.
  2. Handle concurrent access — multiple tasks will read/write simultaneously. Use connection pooling or interior mutability.
  3. Honour TTLstore_kv accepts an optional TTL. Expired entries must not be returned by get_kv.
  4. Override list_kv_keys — the default returns an empty Vec. Analytics, compliance, and RBAC queries depend on real data.
  5. Implement cleanup_expired — periodically called to prune stale tokens and sessions.

§Example (skeleton)

use auth_framework::storage::{AuthStorage, SessionData};
use auth_framework::tokens::AuthToken;
use auth_framework::errors::Result;
use async_trait::async_trait;
use std::time::Duration;

struct MyStorage { /* ... */ }

#[async_trait]
impl AuthStorage for MyStorage {
    async fn store_token(&self, token: &AuthToken) -> Result<()> { todo!() }
    async fn get_token(&self, token_id: &str) -> Result<Option<AuthToken>> { todo!() }
    async fn get_token_by_access_token(&self, _: &str) -> Result<Option<AuthToken>> { todo!() }
    async fn update_token(&self, token: &AuthToken) -> Result<()> { todo!() }
    async fn delete_token(&self, token_id: &str) -> Result<()> { todo!() }
    async fn list_user_tokens(&self, user_id: &str) -> Result<Vec<AuthToken>> { todo!() }
    async fn store_session(&self, id: &str, data: &SessionData) -> Result<()> { todo!() }
    async fn get_session(&self, id: &str) -> Result<Option<SessionData>> { todo!() }
    async fn delete_session(&self, id: &str) -> Result<()> { todo!() }
    async fn list_user_sessions(&self, user_id: &str) -> Result<Vec<SessionData>> { todo!() }
    async fn count_active_sessions(&self) -> Result<u64> { todo!() }
    async fn store_kv(&self, key: &str, value: &[u8], ttl: Option<Duration>) -> Result<()> { todo!() }
    async fn get_kv(&self, key: &str) -> Result<Option<Vec<u8>>> { todo!() }
    async fn delete_kv(&self, key: &str) -> Result<()> { todo!() }
    async fn list_kv_keys(&self, prefix: &str) -> Result<Vec<String>> { todo!() }
    async fn cleanup_expired(&self) -> Result<()> { todo!() }
}

Required Methods§

Source

fn store_token<'life0, 'life1, 'async_trait>( &'life0 self, token: &'life1 AuthToken, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Store a token.

Source

fn get_token<'life0, 'life1, 'async_trait>( &'life0 self, token_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<AuthToken>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Retrieve a token by ID.

Source

fn get_token_by_access_token<'life0, 'life1, 'async_trait>( &'life0 self, access_token: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<AuthToken>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Retrieve a token by access token string.

Source

fn update_token<'life0, 'life1, 'async_trait>( &'life0 self, token: &'life1 AuthToken, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Update a token.

Source

fn delete_token<'life0, 'life1, 'async_trait>( &'life0 self, token_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Delete a token.

Source

fn list_user_tokens<'life0, 'life1, 'async_trait>( &'life0 self, user_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<AuthToken>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

List all tokens for a user.

Source

fn store_session<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, session_id: &'life1 str, data: &'life2 SessionData, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Store session data.

Source

fn get_session<'life0, 'life1, 'async_trait>( &'life0 self, session_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<SessionData>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Retrieve session data.

Source

fn delete_session<'life0, 'life1, 'async_trait>( &'life0 self, session_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Delete session data.

Source

fn list_user_sessions<'life0, 'life1, 'async_trait>( &'life0 self, user_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<SessionData>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

List all sessions for a user.

Source

fn count_active_sessions<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Count currently active sessions (non-expired)

Source

fn store_kv<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, key: &'life1 str, value: &'life2 [u8], ttl: Option<Duration>, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Store arbitrary key-value data with expiration.

Source

fn get_kv<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Retrieve arbitrary key-value data.

Source

fn delete_kv<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Delete arbitrary key-value data.

Source

fn cleanup_expired<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Clean up expired data.

Provided Methods§

Source

fn store_tokens_bulk<'life0, 'life1, 'async_trait>( &'life0 self, tokens: &'life1 [AuthToken], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Bulk store tokens.

Source

fn delete_tokens_bulk<'life0, 'life1, 'async_trait>( &'life0 self, token_ids: &'life1 [String], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Bulk delete tokens by ID.

Source

fn store_sessions_bulk<'life0, 'life1, 'async_trait>( &'life0 self, sessions: &'life1 [(String, SessionData)], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Bulk store sessions.

Source

fn delete_sessions_bulk<'life0, 'life1, 'async_trait>( &'life0 self, session_ids: &'life1 [String], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Bulk delete sessions by ID.

Source

fn list_kv_keys<'life0, 'life1, 'async_trait>( &'life0 self, _prefix: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

List keys with a specific prefix.

Important: All storage backends must override this method to return real key data. The default returns an empty Vec for backward compatibility but will cause analytics, compliance, and RBAC queries to operate on empty data.

Implementors§