sa_token_plugin_actix_web/
lib.rs

1// Author: 金书记
2//
3//! # sa-token-plugin-actix-web
4//! 
5//! Actix-web框架集成插件
6
7pub mod middleware;
8pub mod extractor;
9pub mod adapter;
10
11pub use middleware::{SaTokenMiddleware, SaCheckLoginMiddleware};
12pub use extractor::{SaTokenExtractor, OptionalSaTokenExtractor, LoginIdExtractor};
13pub use adapter::{ActixRequestAdapter, ActixResponseAdapter};
14
15use std::sync::Arc;
16use actix_web::web::Data;
17use sa_token_core::{SaTokenManager, SaTokenConfig};
18use sa_token_adapter::storage::SaStorage;
19
20/// Actix-web应用数据
21pub type SaTokenData = Data<SaTokenState>;
22
23/// 应用状态
24#[derive(Clone)]
25pub struct SaTokenState {
26    pub manager: Arc<SaTokenManager>,
27}
28
29impl SaTokenState {
30    /// 创建状态构建器
31    pub fn builder() -> SaTokenStateBuilder {
32        SaTokenStateBuilder::new()
33    }
34}
35
36/// 状态构建器
37pub struct SaTokenStateBuilder {
38    storage: Option<Arc<dyn SaStorage>>,
39    token_name: Option<String>,
40    timeout: Option<i64>,
41    active_timeout: Option<i64>,
42}
43
44impl SaTokenStateBuilder {
45    pub fn new() -> Self {
46        Self {
47            storage: None,
48            token_name: None,
49            timeout: None,
50            active_timeout: None,
51        }
52    }
53    
54    pub fn storage(mut self, storage: Arc<dyn SaStorage>) -> Self {
55        self.storage = Some(storage);
56        self
57    }
58    
59    pub fn token_name(mut self, name: impl Into<String>) -> Self {
60        self.token_name = Some(name.into());
61        self
62    }
63    
64    pub fn timeout(mut self, timeout: i64) -> Self {
65        self.timeout = Some(timeout);
66        self
67    }
68    
69    pub fn active_timeout(mut self, timeout: i64) -> Self {
70        self.active_timeout = Some(timeout);
71        self
72    }
73    
74    pub fn build(self) -> Data<SaTokenState> {
75        let storage = self.storage
76            .expect("Storage is required");
77        
78        let mut config = SaTokenConfig::default();
79        if let Some(name) = self.token_name {
80            config.token_name = name;
81        }
82        if let Some(timeout) = self.timeout {
83            config.timeout = timeout;
84        }
85        if let Some(active_timeout) = self.active_timeout {
86            config.active_timeout = active_timeout;
87        }
88        
89        let manager = SaTokenManager::new(storage, config);
90        
91        // 自动初始化全局 StpUtil
92        sa_token_core::StpUtil::init_manager(manager.clone());
93        
94        Data::new(SaTokenState {
95            manager: Arc::new(manager),
96        })
97    }
98}
99
100impl Default for SaTokenStateBuilder {
101    fn default() -> Self {
102        Self::new()
103    }
104}