我的客户通过Authorization标头中的令牌进行授权,每个请求都需要检查该令牌。如果没有这个头或者找不到对应的用户,我想返回HTTP代码Unauthorized,否则我想正常处理请求。
目前我有很多重复的代码,因为我正在每个请求处理程序中检查这个标头。该Actix的文档中的第一段表明,它是可能的halt request processing to return a response early。如何做到这一点?
由于我还没有找到实现此行为的示例,因此我尝试提出自己的中间件函数,但无法编译。
为了克服返回两种不同类型(ServiceResponse和Map)的问题,我已经对返回值进行了装箱,因此在如何有条件地返回不同类型的期货?不是问题。更重要的是,我不知道哪些类型具有哪些特征实现需要作为此wrap_fn函数的返回值。我现在拥有的那些不起作用。
App::new()
.wrap(Cors::new().allowed_origin("http://localhost:8080"))
.register_data(state.clone())
.service(
web::scope("/routing")
.wrap_fn(|req, srv| {
let unauth: Box<dyn IntoFuture<Item = ServiceResponse>> = Box::new(ServiceResponse::new(req.into_parts().0, HttpResponse::Unauthorized().finish()));
let auth_header = req.headers().get("Authorization");
match auth_header {
None => unauth,
Some(value) => {
let token = value.to_str().unwrap();
let mut users = state.users.lock().unwrap();
let user_state = users.iter_mut().find(|x| x.auth.token == token);
match user_state {
None => unauth,
Some(user) …Run Code Online (Sandbox Code Playgroud)