sa_token_core/
token_session.rs1use crate::error::{SaTokenError, SaTokenResult};
10use crate::manager::SaTokenManager;
11use crate::session::SaSession;
12use crate::token::TokenValue;
13
14impl SaTokenManager {
15 fn token_session_id(token: &str) -> String {
17 format!("token-session:{token}")
18 }
19
20 pub async fn get_token_session(&self, token: &TokenValue) -> SaTokenResult<SaSession> {
22 if self.config.token_session_check_login && !self.is_valid(token).await {
23 return Err(SaTokenError::NotLogin);
24 }
25
26 if let Some(session) = self.session_repo().get_token_session(token).await? {
27 return Ok(session);
28 }
29
30 let session = SaSession::new(Self::token_session_id(token.as_str()));
31 if self.config.right_now_create_token_session {
32 self.session_repo()
33 .save_token_session(token, &session)
34 .await?;
35 }
36 Ok(session)
37 }
38
39 pub async fn get_anon_token_session(&self, token: &TokenValue) -> SaTokenResult<SaSession> {
41 if let Some(session) = self.session_repo().get_token_session(token).await? {
42 return Ok(session);
43 }
44 Ok(SaSession::new(Self::token_session_id(token.as_str())))
45 }
46
47 pub async fn save_token_session(
49 &self,
50 token: &TokenValue,
51 session: &SaSession,
52 ) -> SaTokenResult<()> {
53 self.session_repo().save_token_session(token, session).await
54 }
55
56 pub async fn delete_token_session(&self, token: &TokenValue) -> SaTokenResult<()> {
58 self.session_repo().delete_token_session(token).await
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65 use crate::config::SaTokenConfig;
66 use sa_token_storage_memory::MemoryStorage;
67 use std::sync::Arc;
68
69 #[tokio::test]
70 async fn test_token_session_create_and_delete() {
71 let config = SaTokenConfig {
72 right_now_create_token_session: true,
73 ..Default::default()
74 };
75 let mgr = SaTokenManager::new(Arc::new(MemoryStorage::new()), config);
76 let token = mgr.login("u1").await.unwrap();
77 let mut session = mgr.get_token_session(&token).await.unwrap();
78 assert!(session.id.starts_with("token-session:"));
79 session.set("k", "v").unwrap();
80 mgr.save_token_session(&token, &session).await.unwrap();
81 let loaded = mgr.get_token_session(&token).await.unwrap();
82 assert_eq!(loaded.get::<String>("k"), Some("v".to_string()));
83 mgr.delete_token_session(&token).await.unwrap();
84 let key = mgr.keys().token_session(token.as_str());
86 let raw = mgr.storage().get(&key).await.unwrap();
87 assert!(raw.is_none(), "token_session key must be deleted");
88 let after = mgr.get_token_session(&token).await.unwrap();
89 assert!(after.get::<String>("k").is_none());
90 }
91}