sa_token_plugin_rocket/
state.rs

1// Author: 金书记
2//
3//! Sa-Token 状态管理
4
5use std::sync::Arc;
6use sa_token_core::{SaTokenManager, SaTokenListener};
7use sa_token_adapter::storage::SaStorage;
8
9/// Rocket 应用状态
10#[derive(Clone)]
11pub struct SaTokenState {
12    pub manager: Arc<SaTokenManager>,
13}
14
15impl SaTokenState {
16    /// 创建新的 Sa-Token 状态
17    pub fn new(manager: Arc<SaTokenManager>) -> Self {
18        Self { manager }
19    }
20    
21    /// 从存储和配置创建状态
22    pub fn from_storage_and_config(storage: Arc<dyn SaStorage>, config: sa_token_core::SaTokenConfig) -> Self {
23        Self {
24            manager: Arc::new(SaTokenManager::new(storage, config)),
25        }
26    }
27    
28    /// 创建状态构建器
29    pub fn builder() -> SaTokenStateBuilder {
30        SaTokenStateBuilder::new()
31    }
32}
33
34/// 状态构建器
35#[derive(Default)]
36pub struct SaTokenStateBuilder {
37    config_builder: sa_token_core::config::SaTokenConfigBuilder,
38    listeners: Vec<Arc<dyn SaTokenListener>>,
39}
40
41impl SaTokenStateBuilder {
42    pub fn new() -> Self {
43        Self::default()
44    }
45    
46    /// 设置存储
47    pub fn storage(mut self, storage: Arc<dyn SaStorage>) -> Self {
48        self.config_builder = self.config_builder.storage(storage);
49        self
50    }
51    
52    /// 设置 token 名称
53    pub fn token_name(mut self, name: impl Into<String>) -> Self {
54        self.config_builder = self.config_builder.token_name(name);
55        self
56    }
57    
58    /// 设置超时时间(秒)
59    pub fn timeout(mut self, timeout: i64) -> Self {
60        self.config_builder = self.config_builder.timeout(timeout);
61        self
62    }
63    
64    /// 设置活动超时时间(秒)
65    pub fn active_timeout(mut self, timeout: i64) -> Self {
66        self.config_builder = self.config_builder.active_timeout(timeout);
67        self
68    }
69    
70    /// 设置是否开启自动续签
71    pub fn auto_renew(mut self, enabled: bool) -> Self {
72        self.config_builder = self.config_builder.auto_renew(enabled);
73        self
74    }
75    
76    /// 设置是否允许并发登录
77    pub fn is_concurrent(mut self, concurrent: bool) -> Self {
78        self.config_builder = self.config_builder.is_concurrent(concurrent);
79        self
80    }
81    
82    /// 设置是否共享 token
83    pub fn is_share(mut self, share: bool) -> Self {
84        self.config_builder = self.config_builder.is_share(share);
85        self
86    }
87    
88    /// 设置 Token 风格
89    pub fn token_style(mut self, style: sa_token_core::config::TokenStyle) -> Self {
90        self.config_builder = self.config_builder.token_style(style);
91        self
92    }
93    
94    /// 设置 token 前缀
95    pub fn token_prefix(mut self, prefix: impl Into<String>) -> Self {
96        self.config_builder = self.config_builder.token_prefix(prefix);
97        self
98    }
99    
100    /// 设置 JWT 密钥
101    pub fn jwt_secret_key(mut self, key: impl Into<String>) -> Self {
102        self.config_builder = self.config_builder.jwt_secret_key(key);
103        self
104    }
105    
106    /// 添加事件监听器
107    pub fn listener(mut self, listener: Arc<dyn SaTokenListener>) -> Self {
108        self.listeners.push(listener);
109        self
110    }
111    
112    /// 添加多个事件监听器
113    pub fn listeners(mut self, listeners: Vec<Arc<dyn SaTokenListener>>) -> Self {
114        self.listeners.extend(listeners);
115        self
116    }
117    
118    /// 构建 Sa-Token 状态
119    pub fn build(self) -> SaTokenState {
120        // config_builder.build() 已经自动初始化了 StpUtil
121        // config_builder.build() already auto-initializes StpUtil
122        let manager = self.config_builder.build();
123        
124        // 注册事件监听器
125        for listener in self.listeners {
126            manager.event_bus().register(listener);
127        }
128        
129        // 直接创建 SaTokenState,config_builder.build() 已经初始化了 StpUtil
130        // Create SaTokenState directly, config_builder.build() already initialized StpUtil
131        SaTokenState {
132            manager: Arc::new(manager),
133        }
134    }
135}