Skip to main content

summer_sa_token/
config.rs

1//! Sa-Token configuration module
2//!
3//! This module defines the configuration for summer-sa-token plugin.
4
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7use summer::config::Configurable;
8// Re-export CoreConfig from upstream
9pub use sa_token_core::config::SaTokenConfig as CoreConfig;
10
11summer::submit_config_schema!("sa-token", SaTokenConfig);
12
13/// Token style for summer-sa-token
14///
15/// This is a local wrapper around the upstream TokenStyle to support JsonSchema
16#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema)]
17#[serde(rename_all = "PascalCase")]
18pub enum TokenStyle {
19    /// UUID style
20    Uuid,
21    /// Simple UUID (without hyphens)
22    SimpleUuid,
23    /// 32-character random string
24    Random32,
25    /// 64-character random string
26    Random64,
27    /// 128-character random string
28    Random128,
29    /// JWT style (JSON Web Token)
30    Jwt,
31    /// Hash style (SHA256 hash)
32    Hash,
33    /// Timestamp style (millisecond timestamp + random)
34    Timestamp,
35    /// Tik style (short 8-character token)
36    Tik,
37}
38
39impl From<TokenStyle> for sa_token_core::config::TokenStyle {
40    fn from(style: TokenStyle) -> Self {
41        match style {
42            TokenStyle::Uuid => sa_token_core::config::TokenStyle::Uuid,
43            TokenStyle::SimpleUuid => sa_token_core::config::TokenStyle::SimpleUuid,
44            TokenStyle::Random32 => sa_token_core::config::TokenStyle::Random32,
45            TokenStyle::Random64 => sa_token_core::config::TokenStyle::Random64,
46            TokenStyle::Random128 => sa_token_core::config::TokenStyle::Random128,
47            TokenStyle::Jwt => sa_token_core::config::TokenStyle::Jwt,
48            TokenStyle::Hash => sa_token_core::config::TokenStyle::Hash,
49            TokenStyle::Timestamp => sa_token_core::config::TokenStyle::Timestamp,
50            TokenStyle::Tik => sa_token_core::config::TokenStyle::Tik,
51        }
52    }
53}
54
55/// Sa-Token configuration for summer-rs
56///
57/// Most fields have sensible defaults.
58///
59/// # Example
60///
61/// ```toml
62/// [sa-token]
63/// token_name = "Authorization"
64/// timeout = 86400
65/// auto_renew = true
66/// ```
67#[derive(Debug, Configurable, Clone, Deserialize, JsonSchema)]
68#[config_prefix = "sa-token"]
69pub struct SaTokenConfig {
70    /// Token name (key in header or cookie)
71    /// Default: "Authorization"
72    #[serde(default = "default_token_name")]
73    pub token_name: String,
74
75    /// Token timeout in seconds, -1 means permanent
76    /// Default: 2592000 (30 days)
77    #[serde(default = "default_timeout")]
78    pub timeout: i64,
79
80    /// Token active timeout in seconds, -1 means no limit
81    /// Default: -1
82    #[serde(default = "default_active_timeout")]
83    pub active_timeout: i64,
84
85    /// Enable auto renew
86    /// Default: false
87    #[serde(default)]
88    pub auto_renew: bool,
89
90    /// Allow concurrent login for same account
91    /// Default: true
92    #[serde(default = "default_true")]
93    pub is_concurrent: bool,
94
95    /// Share token when multiple logins
96    /// Default: true
97    #[serde(default = "default_true")]
98    pub is_share: bool,
99
100    /// Token style
101    /// Default: Uuid
102    #[serde(default = "default_token_style")]
103    pub token_style: TokenStyle,
104
105    /// Enable logging
106    /// Default: false
107    #[serde(default)]
108    pub is_log: bool,
109
110    /// Read token from cookie
111    /// Default: true
112    #[serde(default = "default_true")]
113    pub is_read_cookie: bool,
114
115    /// Read token from header
116    /// Default: true
117    #[serde(default = "default_true")]
118    pub is_read_header: bool,
119
120    /// Read token from body
121    /// Default: false
122    #[serde(default)]
123    pub is_read_body: bool,
124
125    /// Token prefix (e.g., "Bearer ")
126    #[serde(default)]
127    pub token_prefix: Option<String>,
128
129    /// Optional storage key prefix for namespacing Sa-Token keys in Redis.
130    #[serde(default)]
131    pub storage_prefix: Option<String>,
132
133    /// Rewrite the default `sa:` storage root when `storage_prefix` is set.
134    ///
135    /// When disabled:
136    /// - `sa:login:token:admin` -> `demo:sa:login:token:admin`
137    ///
138    /// When enabled:
139    /// - `sa:login:token:admin` -> `demo:login:token:admin`
140    #[serde(default)]
141    pub rewrite_storage_prefix: bool,
142
143    /// JWT secret key
144    #[serde(default)]
145    pub jwt_secret_key: Option<String>,
146
147    /// JWT algorithm
148    /// Default: "HS256"
149    #[serde(default = "default_jwt_algorithm")]
150    pub jwt_algorithm: Option<String>,
151
152    /// JWT issuer
153    #[serde(default)]
154    pub jwt_issuer: Option<String>,
155
156    /// JWT audience
157    #[serde(default)]
158    pub jwt_audience: Option<String>,
159
160    /// Enable nonce for replay attack prevention
161    /// Default: false
162    #[serde(default)]
163    pub enable_nonce: bool,
164
165    /// Nonce timeout in seconds, -1 means use token timeout
166    /// Default: -1
167    #[serde(default = "default_nonce_timeout")]
168    pub nonce_timeout: i64,
169
170    /// Enable refresh token
171    /// Default: false
172    #[serde(default)]
173    pub enable_refresh_token: bool,
174
175    /// Refresh token timeout in seconds
176    /// Default: 604800 (7 days)
177    #[serde(default = "default_refresh_token_timeout")]
178    pub refresh_token_timeout: i64,
179}
180
181impl Default for SaTokenConfig {
182    fn default() -> Self {
183        Self {
184            token_name: default_token_name(),
185            timeout: default_timeout(),
186            active_timeout: default_active_timeout(),
187            auto_renew: false,
188            is_concurrent: true,
189            is_share: true,
190            token_style: TokenStyle::Uuid,
191            is_log: false,
192            is_read_cookie: true,
193            is_read_header: true,
194            is_read_body: false,
195            token_prefix: None,
196            storage_prefix: None,
197            rewrite_storage_prefix: false,
198            jwt_secret_key: None,
199            jwt_algorithm: default_jwt_algorithm(),
200            jwt_issuer: None,
201            jwt_audience: None,
202            enable_nonce: false,
203            nonce_timeout: default_nonce_timeout(),
204            enable_refresh_token: false,
205            refresh_token_timeout: default_refresh_token_timeout(),
206        }
207    }
208}
209
210impl From<SaTokenConfig> for CoreConfig {
211    fn from(config: SaTokenConfig) -> Self {
212        CoreConfig {
213            token_name: config.token_name,
214            timeout: config.timeout,
215            active_timeout: config.active_timeout,
216            auto_renew: config.auto_renew,
217            is_concurrent: config.is_concurrent,
218            is_share: config.is_share,
219            token_style: config.token_style.into(),
220            is_log: config.is_log,
221            is_read_cookie: config.is_read_cookie,
222            is_read_header: config.is_read_header,
223            is_read_body: config.is_read_body,
224            token_prefix: config.token_prefix,
225            jwt_secret_key: config.jwt_secret_key,
226            jwt_algorithm: config.jwt_algorithm,
227            jwt_issuer: config.jwt_issuer,
228            jwt_audience: config.jwt_audience,
229            enable_nonce: config.enable_nonce,
230            nonce_timeout: config.nonce_timeout,
231            enable_refresh_token: config.enable_refresh_token,
232            refresh_token_timeout: config.refresh_token_timeout,
233        }
234    }
235}
236
237// Default value functions
238fn default_token_name() -> String {
239    "Authorization".to_string()
240}
241
242fn default_timeout() -> i64 {
243    2592000 // 30 days
244}
245
246fn default_active_timeout() -> i64 {
247    -1
248}
249
250fn default_true() -> bool {
251    true
252}
253
254fn default_jwt_algorithm() -> Option<String> {
255    Some("HS256".to_string())
256}
257
258fn default_nonce_timeout() -> i64 {
259    -1
260}
261
262fn default_refresh_token_timeout() -> i64 {
263    604800 // 7 days
264}
265
266fn default_token_style() -> TokenStyle {
267    TokenStyle::Uuid
268}