Skip to main content

sa_token_plugin_salvo_v079/
extractor.rs

1use salvo::prelude::*;
2use sa_token_core::{token::TokenValue, error::messages};
3use serde_json::json;
4
5/// 中文: 认证错误 | English: Authentication error
6#[derive(Debug)]
7pub struct AuthError;
8
9impl AuthError {
10    /// 中文: 创建新的认证错误 | English: Create new authentication error
11    pub fn new() -> Self {
12        Self
13    }
14    
15    /// 中文: 获取错误消息 | English: Get error message
16    pub fn message(&self) -> &'static str {
17        messages::AUTH_ERROR
18    }
19    
20    /// 中文: 转换为 JSON 字符串 | English: Convert to JSON string
21    pub fn to_json(&self) -> String {
22        json!({
23            "code": 401,
24            "message": self.message()
25        }).to_string()
26    }
27}
28
29impl Default for AuthError {
30    fn default() -> Self {
31        Self::new()
32    }
33}
34
35/// 中文: 必填 Token 提取器,从 Salvo Request 扩展里读取 Token
36/// English: Required token extractor reading TokenValue from Salvo request extensions
37pub struct SaTokenExtractor(pub TokenValue);
38
39impl SaTokenExtractor {
40    /// 中文: 获取 Token 值 | English: Get token value
41    pub fn token(&self) -> &TokenValue {
42        &self.0
43    }
44    
45    /// 中文: 中间件注入 Token 后,从 extensions 中取出
46    /// English: Fetches TokenValue injected by middleware in extensions
47    pub fn from_request(req: &Request) -> Result<Self, AuthError> {
48        req.extensions()
49            .get::<TokenValue>()
50            .cloned()
51            .map(SaTokenExtractor)
52            .ok_or_else(AuthError::new)
53    }
54}
55
56/// 中文: 可选 Token 提取器,适用于无需强制登录的场景
57/// English: Optional token extractor for routes without mandatory login
58pub struct OptionalSaTokenExtractor(pub Option<TokenValue>);
59
60impl OptionalSaTokenExtractor {
61    /// 中文: 获取 Option<TokenValue> | English: Get Option<TokenValue>
62    pub fn token(&self) -> Option<&TokenValue> {
63        self.0.as_ref()
64    }
65    
66    /// 中文: 返回 Option<TokenValue>,不存在则为 None
67    /// English: Returns Option<TokenValue>, None when token absent
68    pub fn from_request(req: &Request) -> Self {
69        let token = req.extensions().get::<TokenValue>().cloned();
70        OptionalSaTokenExtractor(token)
71    }
72}
73
74/// 中文: 登录 ID 提取器,从请求扩展中获取 login_id
75/// English: Login ID extractor fetching login_id from request extensions
76pub struct LoginIdExtractor(pub String);
77
78impl LoginIdExtractor {
79    /// 中文: 获取登录 ID | English: Get login ID
80    pub fn login_id(&self) -> &str {
81        &self.0
82    }
83    
84    /// 中文: 若登录状态已建立,中间件会写入 login_id
85    /// English: Middleware stores login_id when session is authenticated
86    pub fn from_request(req: &Request) -> Result<Self, AuthError> {
87        req.extensions()
88            .get::<String>()
89            .cloned()
90            .map(LoginIdExtractor)
91            .ok_or_else(AuthError::new)
92    }
93}
94
95// 这些处理程序可以在应用中定义,而不是在库中
96// These handlers can be defined in the application, not in the library