gpt4 book ai didi

authentication - 如何在 actix-web 中创建 protected 路由

转载 作者:行者123 更新时间:2023-12-03 15:07:00 28 4
gpt4 key购买 nike

我需要验证用户是否有权访问某些路线。
我已经创建了 3 个“范围”(访客、身份验证用户、管理员),现在我不知道如何检查用户是否可以访问这些路由。
我正在尝试实现 auth-middleware,这个中间件应该检查​​用户是否有正确的 cookie 或 token 。 (我可以从请求 header 中打印出一个 cookie),但我不知道如何导入、使用 actix_identity 以及如何访问此中间件中的 id 参数。
我相信我的问题不仅与 Actix-identity 有关,而且我无法在中间件内部传递参数。

    #[actix_rt::main]
async fn main() -> std::io::Result<()> {

let cookie_key = conf.server.key;

// Register http routes
let mut server = HttpServer::new(move || {
App::new()
// Enable logger
.wrap(Logger::default())
.wrap(IdentityService::new(
CookieIdentityPolicy::new(cookie_key.as_bytes())
.name("auth-cookie")
.path("/")
.secure(false),
))
//limit the maximum amount of data that server will accept
.data(web::JsonConfig::default().limit(4096))
//normal routes
.service(web::resource("/").route(web::get().to(status)))
// .configure(routes)
.service(
web::scope("/api")
// guest endpoints
.service(web::resource("/user_login").route(web::post().to(login)))
.service(web::resource("/user_logout").route(web::post().to(logout)))
// admin endpoints
.service(
web::scope("/admin")
// .wrap(AdminAuthMiddleware)
.service(
web::resource("/create_admin").route(web::post().to(create_admin)),
)
.service(
web::resource("/delete_admin/{username}/{_:/?}")
.route(web::delete().to(delete_admin)),
),
)
//user auth routes
.service(
web::scope("/auth")
// .wrap(UserAuthMiddleware)
.service(web::resource("/get_user").route(web::get().to(get_user))),
),
)
});

// Enables us to hot reload the server
let mut listenfd = ListenFd::from_env();
server = if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {
server.listen(l)?
} else {
server.bind(ip)?
};

server.run().await
我尝试过的资源:
  • 为 Actix API 创建身份验证中间件
    https://www.jamesbaum.co.uk/blether/creating-authentication-middleware-actix-rust-react/
  • 中间件中的 Actix-web token 验证 https://users.rust-lang.org/t/actix-web-token-validation-in-middleware/38205
  • Actix 中间件示例 https://github.com/actix/examples/tree/master/middleware

  • 也许我认为完全错误,并且 auth-middleware 不是我问题的最佳解决方案。
    希望你能帮我创建“ protected 路由”

    最佳答案

    试试提取器
    尝试在 Actix 3 中实现这种模式时,我在尝试使用中间件时头疼了一阵子,主要是制作了一个守卫,然后弄清楚如何将数据从中间件传递到处理程序中。这很痛苦,最终我意识到我是在反对 Actix 而不是在使用它。
    最后我了解到将信息传递给处理程序的方法是创建一个结构体( AuthedUser ,也许?)并实现 FromRequest该结构上的特征。
    然后每个请求 AuthedUser 的处理程序在函数签名中将进行身份验证,如果用户已登录,将有任何用户信息附加到 AuthedUserFromRequest::from_request方法。
    Actix 引用了这些实现 FromRequest 的结构体。作为提取器。这有点神奇,可以在指南中使用更多的注意力。

    关于authentication - 如何在 actix-web 中创建 protected 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62269278/

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