pub trait SessionStore: Send + Sync {
// Required methods
fn put(&self, rec: SessionRecord) -> Result<(), StoreError>;
fn get(&self, token: &str) -> Result<Option<SessionRecord>, StoreError>;
fn touch(&self, token: &str, now: u64) -> Result<(), StoreError>;
fn revoke(&self, token: &str) -> Result<(), StoreError>;
fn revoke_subject(&self, subject: &str) -> Result<usize, StoreError>;
fn recent_logins(
&self,
subject: &str,
) -> Result<Vec<LoginPoint>, StoreError>;
fn record_login(
&self,
subject: &str,
point: LoginPoint,
) -> Result<(), StoreError>;
fn purge_expired(&self, now: u64) -> Result<usize, StoreError>;
}Expand description
会话存储后端。
guard 按值持有 store(SessionGuard<S> 的字段就是 S),而本 trait
没有为 Arc<T> 提供 blanket impl —— 所以 Arc<MemoryStore> 不是
SessionStore,两个 guard 想共享同一份存储得包一层 newtype 并转发全部方法。
多线程场景不必如此:SessionGuard<S> 本身是 Send + Sync,共享一个
Arc<SessionGuard<MemoryStore>>(见 examples/axum_middleware.rs)即可。
Required Methods§
fn put(&self, rec: SessionRecord) -> Result<(), StoreError>
Sourcefn get(&self, token: &str) -> Result<Option<SessionRecord>, StoreError>
fn get(&self, token: &str) -> Result<Option<SessionRecord>, StoreError>
原样返回记录,不过滤过期。过期判定归 guard ——
若此处对过期记录返回 None,verify 将无法区分 TokenExpired 与 TokenUnknown。
fn touch(&self, token: &str, now: u64) -> Result<(), StoreError>
fn revoke(&self, token: &str) -> Result<(), StoreError>
Sourcefn revoke_subject(&self, subject: &str) -> Result<usize, StoreError>
fn revoke_subject(&self, subject: &str) -> Result<usize, StoreError>
吊销某 subject 的全部会话,返回受影响条数。
Sourcefn recent_logins(&self, subject: &str) -> Result<Vec<LoginPoint>, StoreError>
fn recent_logins(&self, subject: &str) -> Result<Vec<LoginPoint>, StoreError>
该 subject 的登录历史,按时间升序(最旧在前)。
fn record_login( &self, subject: &str, point: LoginPoint, ) -> Result<(), StoreError>
Sourcefn purge_expired(&self, now: u64) -> Result<usize, StoreError>
fn purge_expired(&self, now: u64) -> Result<usize, StoreError>
清除已过期记录,并回收超过 LOGIN_HISTORY_KEEP_SECS 未再登录的
subject 的登录历史;返回清除的会话条数。
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".