rust 如何创建一个中间件,可以读取ActixWeb中的cookie

yxyvkwin  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(269)

我在httpOnly cookie中设置了数据,这意味着javascript不能直接与之交互,但在每个请求中都将其发送到后端。
Cookie的内容用于授权目的。现在,我可以在每个处理程序中包含逻辑来提取cookie的内容,但我认为这将是乏味的。
因此,我想提取逻辑来获取cookie值,并在中间件中执行授权逻辑。但不幸的是我没能找到答案。
我发现的close是基于使用actix_session的,但这并不符合我的要求,因为它仍然需要将Session注入到每个处理程序中,然后执行授权检查。我将处理程序不包含这个逻辑,因此我将喜欢把它放在中间件中。
你有什么想法吗

q9yhzks0

q9yhzks01#

传递一个actix_web::dev::ServiceRequest参数并从.cookie获取cookie应该读取cookie数据:

use actix_web::{dev, web, HttpResponse};
use futures::future::{ok, Ready};

async fn auth_middleware(req: dev::ServiceRequest, srv: web::Data<actix_web::AppState>) -> Result<dev::ServiceResponse, actix_web::Error> {
    let cookie_value = req
        .cookie("name-of-cookie")
        .map(|cookie| cookie.value().to_owned())
        .ok_or_else(|| HttpResponse::Unauthorized().finish())?;

    if !is_authorized(&cookie_value) {
        return Err(HttpResponse::Unauthorized().finish().into());
    }

    // authorized ? continue to the next middleware/handler
    let fut = srv
        .get_ref()
        .clone()
        .call(req)
        .await
        .map_err(|e| HttpResponse::InternalServerError().body(e.to_string()))?;
    Ok(fut)
}

fn is_authorized(cookie_value: &str) -> bool {
    // Authorization logic here
    true
}

let app = App::new()
    .data(AppState {})
    .wrap_fn(auth_middleware) 
    .service(/* actix-web services */);

相关问题