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