Возврат несанкционированного ответа в промежуточном программном обеспечении actix-web в Rust

#rust #middleware #actix-web

Вопрос:

За последние несколько недель я окунулся в удивительный мир Rust и Actix-Web и работаю над созданием различных типов аутентификации с помощью промежуточного программного обеспечения actix-web. У меня полностью продумана вся логика аутентификации, но я не могу понять, как вернуть несанкционированный HTTP-ответ от промежуточного программного обеспечения, если пользователь не прошел проверку подлинности.

Вот как определяется служебная черта. Очень стандартно, судя по тому, что я видел.

 impl<S, B> Service<ServiceRequest> for AuthMiddleware<S>
  where
      S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error>
            'static,
      S::Future: 'static,
      B: 'static
  {
      type Response = ServiceResponse<B>;
      type Error = Error;
      type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>;
 

И вот конец call() того, где я пытаюсь вернуть конкретный ответ, основанный на том, является ли переменная authenticate_fail истинной.

 let svc = self.service.clone();
if authenticate_fail {
    return Box::pin(async move {     
        let res = req.into_response(
            HttpResponse::Unauthorized()
            .finish()
         );
         Ok(res)
    })
}
 

Проблема, с которой я сталкиваюсь, заключается в том, что Ржавчина кричит на меня, потому что переменная res-это ServiceResponse<AnyBody> когда это необходимо ServiceResponse<B> .

Теперь я вижу, что причина проблемы, по-видимому, заключается в том, что я использую Actix Web 4, в котором into_response() метод вернет объект ответа, но у него будет тип <AnyBody> , а не <B> . Я знаю, что мог бы перейти в Actix 3.3.2, чтобы устранить проблему, но я надеюсь, что кто-нибудь сможет либо объяснить, что я делаю неправильно здесь, либо показать мне, что в Actix 4 считается правильным способом возврата несанкционированного ответа от промежуточного программного обеспечения.

Я все еще очень новичок в Ржавчине, поэтому я уверен, что здесь может быть что-то, чего я не до конца понимаю.

Спасибо!

Комментарии:

1. В поисках той же самой проблемы…

2. @Deisss Ты что-нибудь выяснил? Пожалуйста, дайте мне знать, если вы это сделаете.

3. Я сделал это, я просто удалил шаблон «B» везде… Сделал трюк для меня, затем он принимает компиляцию и снова хорошо работает…

4. Это сработало. Это ты! @Deisss