20

ユーザーがいくつかのルートの許可を持っているかどうかを確認する必要があります。3 つの「スコープ」(ゲスト、認証ユーザー、管理者) を作成しましたが、ユーザーがこれらのルートにアクセスできるかどうかを確認する方法がわかりません。

認証ミドルウェアを実装しようとしていますが、このミドルウェアは、ユーザーが正しい Cookie またはトークンを持っているかどうかを確認する必要があります。(リクエスト ヘッダーから 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

私が試したリソース:

  1. Actix API の認証ミドルウェアの作成 https://www.jamesbaum.co.uk/blether/creating-authentication-middleware-actix-rust-react/

  2. ミドルウェアでの Actix-web トークンの検証https://users.rust-lang.org/t/actix-web-token-validation-in-middleware/38205

  3. Actix ミドルウェアの例https://github.com/actix/examples/tree/master/middleware

たぶん私は完全に間違っていると思います.auth-middlewareは私の問題に対する最良の解決策ではありません. 「保護されたルート」の作成にご協力いただければ幸いです

4

5 に答える 5