アプリケーションのグローバル状態にアクセスして認証トークンの検証を実行することを目的とした単純なミドルウェアがあります。
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>,
}