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
| Backend | Type | Feature flag |
|---|---|---|
| In-memory (DashMap) | MemoryStorage | (always available) |
| PostgreSQL | PostgresStorage | postgres-storage |
| MySQL | MySqlStorage | mysql-storage |
| Redis | [RedisStorage] | redis-storage |
| SQLite | SqliteStorage | sqlite-storage |
| Encrypted wrapper | EncryptedStorage | (always available) |
§Implementing This Trait
Custom storage backends must:
- Be thread-safe — the trait requires
Send + Sync. - Handle concurrent access — multiple tasks will read/write simultaneously. Use connection pooling or interior mutability.
- Honour TTL —
store_kvaccepts an optional TTL. Expired entries must not be returned byget_kv. - Override
list_kv_keys— the default returns an emptyVec. Analytics, compliance, and RBAC queries depend on real data. - 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§
Sourcefn 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 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.
Sourcefn 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<'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.
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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 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)
Sourcefn 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 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.
Sourcefn 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 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.
Provided Methods§
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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 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.
Sourcefn 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,
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.