Доступ к состоянию приложения из промежуточного программного обеспечения веб-приложения Actix
У меня есть простое промежуточное программное обеспечение, предназначенное для доступа к глобальному состоянию приложения для проверки токена аутентификации:
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 ответ
Решение
Используйте свое состояние вместо S
:
impl actix_web::middleware::Middleware<::Application::State> for Authenticator {
}
Кстати, промежуточное ПО тоже может иметь состояние.