gpt4 book ai didi

rust - 从 Actix Web 应用程序中间件访问应用程序状态

转载 作者:行者123 更新时间:2023-11-29 08:13:57 26 4
gpt4 key购买 nike

我有一个简单的中间件,用于访问应用程序的全局状态以执行身份验证 token 的验证:

use actix_web;
use actix_web::HttpMessage;

pub struct Authenticator;

impl<S> actix_web::middleware::Middleware<S> for Authenticator {
fn start(
&self,
request: &mut actix_web::HttpRequest<S>,
) -> actix_web::Result<actix_web::middleware::Started> {
//let _state = request.state() as &::application::State;
match request.headers().get("Authentication") {
Some(_) => Ok(actix_web::middleware::Started::Done),
None => Err(::view::error(
"No authentication header provided",
actix_web::http::StatusCode::FORBIDDEN,
)),
}
}
}

注释字符串显示了我是如何尝试获取状态的。我实际上尝试了很多方法。做这些事情的最佳方式是什么?

我考虑过将对所需数据(例如 ArcRwLock)的引用添加到 Authenticator 结构中,并使用引用构建它当我注册我的中间件时。

我仍然不擅长 trait 的东西,但是必须有一种干净的方法将 S 类型转换为我的应用程序定义的 State 结构:

pub struct State {
pub database: actix::Addr<actix::Syn, ::database::Actor>,
pub cache: ::std::sync::Arc<::cache::Cache>,
pub sessions: ::std::sync::Arc<::session::Storage>,
}

最佳答案

使用你的状态而不是 S:

impl actix_web::middleware::Middleware<::Application::State> for Authenticator {
}

顺便说一句,中间件也可以有状态。

关于rust - 从 Actix Web 应用程序中间件访问应用程序状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50428385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com