sa_token_plugin_salvo_v079/
layer.rs1use salvo::{Depot, FlowCtrl, Handler, Request, Response};
3use salvo::http::StatusCode;
4use sa_token_core::router::PathAuthConfig;
5use sa_token_plugin_salvo_core::{run_auth_flow, SaTokenState};
6
7use crate::adapter::SalvoCapturedRequest;
8
9#[derive(Clone)]
15pub struct SaTokenLayer {
16 state: SaTokenState,
17 path_config: Option<PathAuthConfig>,
18}
19
20impl SaTokenLayer {
21 pub fn new(state: SaTokenState) -> Self {
23 Self {
24 state,
25 path_config: None,
26 }
27 }
28
29 pub fn with_path_auth(state: SaTokenState, config: PathAuthConfig) -> Self {
32 Self {
33 state,
34 path_config: Some(config),
35 }
36 }
37}
38
39#[salvo::async_trait]
40impl Handler for SaTokenLayer {
41 async fn handle(
42 &self,
43 req: &mut Request,
44 depot: &mut Depot,
45 res: &mut Response,
46 ctrl: &mut FlowCtrl,
47 ) {
48 let adapter =
51 SalvoCapturedRequest::capture(req, self.state.manager.config.token_name.as_str());
52 let flow = run_auth_flow(
53 &adapter,
54 &self.state.manager,
55 self.path_config.as_ref(),
56 )
57 .await;
58
59 if flow.should_reject() {
60 res.status_code(StatusCode::UNAUTHORIZED);
61 return;
62 }
63
64 if self.path_config.is_none() {
65 if let Some(ref t) = flow.token {
66 depot.insert("sa_token", t.clone());
67 }
68 if let Some(ref id) = flow.login_id {
69 depot.insert("sa_login_id", id.clone());
70 }
71 }
72
73 flow.run(ctrl.call_next(req, depot, res)).await;
74 }
75}
76
77pub fn extract_token_from_request(req: &Request, token_name: &str) -> Option<String> {
80 let cap = SalvoCapturedRequest::capture(req, token_name);
81 sa_token_core::router::extract_token(&cap, token_name)
82}