actix-web处理post请求保持和spring一致的行为

在使用spring框架,标记为post的控制器其实可以正常处理query和x-www-form-urlencoded参数,如何在actix-web中简单实现和spring一致的行为,可以参考以下代码。下面的代码实现了java nacos同样的用户登录接口。需要注意的是,query和form需要使用Option。

use actix_web::{HttpResponse, Responder, Scope, post, web};
use serde::{Deserialize, Serialize};

use crate::{
    model::{self, common::AppState},
    service::{self, auth::encode_jwt_token},
};

#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
struct LoginResult {
    access_token: String,
    token_ttl: i64,
    global_admin: bool,
    username: String,
}

#[derive(Deserialize)]
struct LoginData {
    username: Option<String>,
    password: Option<String>,
}

#[post("/user/login")]
pub async fn user_login(
    data: web::Data<AppState>,
    form: Option<web::Form<LoginData>>,
    query: Option<web::Query<LoginData>>,
) -> impl Responder {
    let mut username: String = "".to_string();
    let mut password: String = "".to_string();

    if let Some(form_data) = form {
        if let Some(v) = &form_data.username {
            username = v.to_string();
        }
        if let Some(v) = &form_data.password {
            password = v.to_string();
        }
    } else if let Some(query_data) = query {
        if let Some(v) = &query_data.username {
            username = v.to_string();
        }
        if let Some(v) = &query_data.password {
            password = v.to_string();
        }
    }

    if username.is_empty() || password.is_empty() {
        return HttpResponse::Forbidden().body(model::auth::USER_NOT_FOUND_MESSAGE);
    }

    let user_option = service::user::find_by_username(&data.database_connection, &username).await;

    if user_option.is_none() {
        return HttpResponse::Forbidden().body(model::auth::USER_NOT_FOUND_MESSAGE);
    }

    let token_secret_key = data.configuration.token_secret_key();

    let user = user_option.unwrap();
    let bcrypt_result = bcrypt::verify(password, &user.password).unwrap();

    if bcrypt_result {
        let token_expire_seconds = data.configuration.auth_token_expire_seconds();

        let access_token =
            encode_jwt_token(&username, token_secret_key.as_str(), token_expire_seconds).unwrap();

        let global_admin = service::role::has_global_admin_role_by_username(
            &data.database_connection,
            &user.username,
        )
        .await
        .ok()
        .unwrap_or_default();

        let login_result = LoginResult {
            access_token: access_token.clone(),
            token_ttl: token_expire_seconds,
            global_admin: global_admin,
            username: user.username,
        };

        return HttpResponse::Ok()
            .append_header((
                model::auth::AUTHORIZATION_HEADER,
                format!("{}{}", model::auth::TOKEN_PREFIX, access_token),
            ))
            .json(login_result);
    }

    return HttpResponse::Forbidden().body("USER_NOT_FOUND_MESSAGE");
}

pub fn routers() -> Scope {
    return web::scope("/auth")
        .service(user_login)
        .service(super::user::search_page)
        .service(super::user::search)
        .service(super::user::update)
        .service(super::user::create)
        .service(super::user::delete)
        .service(super::role::search_page)
        .service(super::role::create)
        .service(super::role::delete)
        .service(super::role::search)
        .service(super::permission::search_page)
        .service(super::permission::create)
        .service(super::permission::delete);
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 9,053评论 0 6
  • 为了让我有一个更快速、更精彩、更辉煌的成长,我将开始这段刻骨铭心的自我蜕变之旅!从今天开始,我将每天坚持阅...
    李薇帆阅读 6,367评论 1 4
  • 似乎最近一直都在路上,每次出来走的时候感受都会很不一样。 1、感恩一直遇到好心人,很幸运。在路上总是...
    时间里的花Lily阅读 5,424评论 1 3
  • 1、expected an indented block 冒号后面是要写上一定的内容的(新手容易遗忘这一点); 缩...
    庵下桃花仙阅读 3,841评论 0 2
  • 一、工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)矩形、椭圆选框工具 【M】移动工具 【V...
    墨雅丫阅读 4,170评论 0 0

友情链接更多精彩内容