代码之家  ›  专栏  ›  技术社区  ›  hedgar2017

从actix Web应用程序中间件访问应用程序状态

  •  1
  • hedgar2017  · 技术社区  · 7 年前

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

    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,
                )),
            }
        }
    }
    

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

    我考虑过添加对所需数据的引用(例如 Arc D RwLock )致 Authenticator 在注册我的中间商时,使用引用构造它。

    我仍然不擅长品质方面的东西,但必须有一个干净的方法来铸造 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>,
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Shepmaster Tim Diekmann    7 年前

    使用您的状态而不是 S :

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

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

    推荐文章