【发布时间】:2020-06-23 12:24:01
【问题描述】:
我一直在寻找一种方法来告诉 Micronaut (1.3.5) 添加“WWW-Authenticate”标头,以防在 http 基本身份验证设置中身份验证失败。 默认情况下,此标头缺失,仅返回状态代码 401。
【问题讨论】:
我一直在寻找一种方法来告诉 Micronaut (1.3.5) 添加“WWW-Authenticate”标头,以防在 http 基本身份验证设置中身份验证失败。 默认情况下,此标头缺失,仅返回状态代码 401。
【问题讨论】:
答案是提供一个自定义的 ExceptionHandler,如下所示:
/**
* AuthorizationException Handler, which adds header for showing browser basic auth dialogue.
*/
@Singleton
@Primary
public class HttpBasicAuthorizationExceptionHandler
implements ExceptionHandler<AuthorizationException, MutableHttpResponse<?>> {
@Override
public MutableHttpResponse<?> handle(HttpRequest request, AuthorizationException exception) {
return Flowable.fromPublisher(reject(exception.isForbidden())).blockingFirst();
}
/**
* @param forbidden true if the status is HttpStatus.FORBIDDEN, HttpStatus.UNAUTHORIZED otherwise.
* @return the http response.
*/
private Publisher<MutableHttpResponse<?>> reject(boolean forbidden) {
if (forbidden) {
return Publishers.just(HttpResponse.status(HttpStatus.FORBIDDEN));
}
return Publishers.just(
HttpResponse.status(HttpStatus.UNAUTHORIZED)
.header(HttpHeaders.WWW_AUTHENTICATE, "Basic")
);
}
}
【讨论】: