Доступ к состоянию приложения из промежуточного программного обеспечения веб-приложения Actix - PullRequest
0 голосов
/ 19 мая 2018

У меня есть простое промежуточное программное обеспечение, предназначенное для доступа к глобальному состоянию приложения для проверки токена аутентификации:

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 Ответ

0 голосов
/ 19 мая 2018

Используйте ваше состояние вместо S:

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

Кстати, промежуточное ПО также может иметь состояние.

...