#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