sa_token_plugin_rocket/
extractor.rs

1// Author: 金书记
2//
3//! Rocket Request Guards (提取器)
4
5use rocket::request::{FromRequest, Request, Outcome};
6use rocket::http::Status;
7use sa_token_core::token::TokenValue;
8
9/// Token 守卫 - 必须存在,否则返回错误
10pub struct SaTokenGuard(pub TokenValue);
11
12#[rocket::async_trait]
13impl<'r> FromRequest<'r> for SaTokenGuard {
14    type Error = ();
15    
16    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
17        let token = request.local_cache(|| None::<TokenValue>);
18        if let Some(token) = token {
19            return Outcome::Success(SaTokenGuard(token.clone()));
20        }
21        
22        Outcome::Error((Status::Unauthorized, ()))
23    }
24}
25
26/// 可选 Token 守卫 - 不存在也不报错
27pub struct OptionalSaTokenGuard(pub Option<TokenValue>);
28
29#[rocket::async_trait]
30impl<'r> FromRequest<'r> for OptionalSaTokenGuard {
31    type Error = ();
32    
33    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
34        let token = request.local_cache(|| None::<TokenValue>).clone();
35        Outcome::Success(OptionalSaTokenGuard(token))
36    }
37}
38
39/// LoginId 守卫 - 直接获取登录用户的 ID
40pub struct LoginIdGuard(pub String);
41
42#[rocket::async_trait]
43impl<'r> FromRequest<'r> for LoginIdGuard {
44    type Error = ();
45    
46    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
47        let login_id = request.local_cache(|| None::<String>);
48        if let Some(login_id) = login_id {
49            return Outcome::Success(LoginIdGuard(login_id.clone()));
50        }
51        
52        Outcome::Error((Status::Unauthorized, ()))
53    }
54}