sa_token_core/token/
mod.rs

1// Author: 金书记
2//
3//! Token 管理模块
4
5use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7
8pub mod generator;
9pub mod validator;
10
11pub use generator::TokenGenerator;
12pub use validator::TokenValidator;
13
14/// Token 值
15#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
16pub struct TokenValue(String);
17
18impl TokenValue {
19    pub fn new(value: impl Into<String>) -> Self {
20        Self(value.into())
21    }
22    
23    pub fn as_str(&self) -> &str {
24        &self.0
25    }
26}
27
28impl From<String> for TokenValue {
29    fn from(s: String) -> Self {
30        Self(s)
31    }
32}
33
34impl From<TokenValue> for String {
35    fn from(v: TokenValue) -> Self {
36        v.0
37    }
38}
39
40impl std::fmt::Display for TokenValue {
41    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42        write!(f, "{}", self.0)
43    }
44}
45
46/// Token 信息
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct TokenInfo {
49    /// Token 值
50    pub token: TokenValue,
51    
52    /// 登录 ID
53    pub login_id: String,
54    
55    /// 登录类型(user、admin 等)
56    pub login_type: String,
57    
58    /// Token 创建时间
59    pub create_time: DateTime<Utc>,
60    
61    /// Token 最后活跃时间
62    pub last_active_time: DateTime<Utc>,
63    
64    /// Token 过期时间(None 表示永不过期)
65    pub expire_time: Option<DateTime<Utc>>,
66    
67    /// 设备标识
68    pub device: Option<String>,
69    
70    /// 额外数据
71    pub extra_data: Option<serde_json::Value>,
72}
73
74impl TokenInfo {
75    pub fn new(token: TokenValue, login_id: impl Into<String>) -> Self {
76        let now = Utc::now();
77        Self {
78            token,
79            login_id: login_id.into(),
80            login_type: "default".to_string(),
81            create_time: now,
82            last_active_time: now,
83            expire_time: None,
84            device: None,
85            extra_data: None,
86        }
87    }
88    
89    pub fn is_expired(&self) -> bool {
90        if let Some(expire_time) = self.expire_time {
91            Utc::now() > expire_time
92        } else {
93            false
94        }
95    }
96    
97    pub fn update_active_time(&mut self) {
98        self.last_active_time = Utc::now();
99    }
100}
101
102/// Token 签名
103#[derive(Debug, Clone)]
104pub struct TokenSign {
105    pub value: String,
106    pub device: Option<String>,
107}