我有一个actix-web
使用HttpAuthentication
中间件对所有请求进行身份验证的服务器。服务器运行良好并且正确响应大多数请求,但偶尔某些请求会触发错误:
thread 'actix-rt:worker:2' panicked at 'AuthenticationMiddleware was called already
对同一端点的请求只会在某些时候触发错误,所以我不确定根本原因是什么。
我的main()
功能(仅包含相关代码是:
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
// Some configuration code here
HttpServer::new(move || {
App::new()
.wrap(
HttpAuthentication::basic(validator)
)
// other code here
})
.bind(ip)?
.run()
.await
}
作为参数validator
传递给的函数是:process_fn
HttpAuthentication::basic
async fn validator(
req: ServiceRequest,
credentials: BasicAuth,
) -> Result<ServiceRequest, Error> {
let config = req.app_data::<Config>()
.map(|data| data.get_ref().clone())
.unwrap_or_else(Default::default)
.scope("urn:example:channel=HBO&urn:example:rating=G,PG-13");
let username = env::var("USERNAME")
.expect("USERNAME must be set");
let password = env::var("PASSWORD")
.expect("USERNAME must be set");
if credentials.user_id().deref() == username {
match credentials.password() {
Some(pass) => {
if pass.deref() == password {
Ok(req)
} else {
Err(AuthenticationError::from(config).into())
}
}
None => Err(AuthenticationError::from(config).into())
}
} else {
Err(AuthenticationError::from(config).into())
}
}
该功能本质上只是检查请求中发送的基本身份验证用户名和密码的有效性。据我了解,这应该包装服务器上的每个端点,并且只允许经过身份验证的请求通过。
我不明白为什么我会收到此运行时错误。有没有人知道为什么会这样?