Joe*_*mel 2 rust async-await actix-web
我正在使用 sqlx 访问数据库的 actix-web 2.0.0 中实现身份验证提取器。我有这个代码:
use actix_web::{dev, web, Error, HttpRequest, FromRequest};
use actix_web::error::ErrorUnauthorized;
use futures::future::{ok, err, Ready};
use sqlx::PgPool;
use serde_derive::Deserialize;
use crate::model::User;
#[derive(Debug, Deserialize)]
pub struct Auth {
user_id: u32,
}
impl FromRequest for Auth {
type Error = Error;
type Future = Ready<Result<Self, Self::Error>>;
type Config = ();
fn from_request(req: &HttpRequest, _: &mut dev::Payload) -> Self::Future {
use actix_web::HttpMessage;
let db_pool = req.app_data::<web::Data<PgPool>>().unwrap();
let error = ErrorUnauthorized("{\"details\": \"Please log in\"}");
if let Some(session_id) = req.cookie("sessionid") {
log::info!("Session id {}", session_id);
// let result = User::find_by_session(db_pool.get_ref(), session_id).await;
ok(Auth { user_id: 0 })
} else {
err(error)
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,我不能await在那里使用。我看到了一个使用type Future = Pin<Box<dyn Future<Output = Result<Self, Self::Error>>>>并返回的示例,Box::pin(async move { ... })但我无法使其工作(生命周期有问题req)。
我设法做到了。我之前提取过 cookie,async move所以req.
use std::pin::Pin;
use futures::Future;
use actix_web::{dev, web, Error, HttpRequest, FromRequest};
use actix_web::error::ErrorUnauthorized;
use sqlx::PgPool;
use serde_derive::Deserialize;
use crate::model::User;
#[derive(Debug, Deserialize)]
pub struct Auth {
user_id: u32,
}
impl FromRequest for Auth {
type Error = Error;
type Future = Pin<Box<dyn Future<Output = Result<Self, Self::Error>>>>;
type Config = ();
fn from_request(req: &HttpRequest, _: &mut dev::Payload) -> Self::Future {
use actix_web::HttpMessage;
let db_pool = req.app_data::<web::Data<PgPool>>().unwrap().clone();
let cookie = req.cookie("sessionid");
Box::pin(async move {
let error = Err(ErrorUnauthorized("{\"details\": \"Please log in\"}"));
if let Some(session_id) = cookie {
let result = User::find_by_session(db_pool.get_ref(), session_id).await;
// auth code
Ok(Auth { user_id: 0 })
} else {
error
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |