gpt4 book ai didi

rust - 如何在 actix-web 提取器中使用异步代码?

转载 作者:行者123 更新时间:2023-12-03 11:30:49 27 4
gpt4 key购买 nike

我正在使用 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)
}

}
}
当然,我不能用 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
}
})
}
}

关于rust - 如何在 actix-web 提取器中使用异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63308246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com