Spring Security Webflow/反应性异常处理 [英] Spring Security Webflux/Reactive Exception Handling
本文介绍了Spring Security Webflow/反应性异常处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在Spring Webflow上构建应用程序,我被卡住了,因为Spring安全Webflow(v.M5)在异常处理方面的行为不像Spring4。
我看到了以下关于如何定制Spring安全Webflow的帖子: Spring webflux custom authentication for API
如果我们在ServerSecurityContextRepository.Load中抛出异常let,则Spring会将http头更新为500,而我无法处理此异常。
但是,在控制器中抛出的任何错误都可以使用Regular@ControllerAdance进行处理,它只会引发Web流量安全。
Spring WebFlux安全中是否有处理异常的方法?
推荐答案
我找到的解决方案是创建一个实现ErrorWebExceptionHandler
的组件。ErrorWebExceptionHandler
Bean的实例在Spring Security筛选器之前运行。下面是我使用的一个示例:
@Slf4j
@Component
public class GlobalExceptionHandler implements ErrorWebExceptionHandler {
@Autowired
private DataBufferWriter bufferWriter;
@Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
AppError appError = ErrorCode.GENERIC.toAppError();
if (ex instanceof AppException) {
AppException ae = (AppException) ex;
status = ae.getStatusCode();
appError = new AppError(ae.getCode(), ae.getText());
log.debug(appError.toString());
} else {
log.error(ex.getMessage(), ex);
}
if (exchange.getResponse().isCommitted()) {
return Mono.error(ex);
}
exchange.getResponse().setStatusCode(status);
return bufferWriter.write(exchange.getResponse(), appError);
}
}
如果您改为注入HttpHandler
,则会略有不同,但思路是相同的。
更新:为了完整起见,下面是我的DataBufferWriter
对象,它是@Component
:
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j
public class DataBufferWriter {
private final ObjectMapper objectMapper;
public <T> Mono<Void> write(ServerHttpResponse httpResponse, T object) {
return httpResponse
.writeWith(Mono.fromSupplier(() -> {
DataBufferFactory bufferFactory = httpResponse.bufferFactory();
try {
return bufferFactory.wrap(objectMapper.writeValueAsBytes(object));
} catch (Exception ex) {
log.warn("Error writing response", ex);
return bufferFactory.wrap(new byte[0]);
}
}));
}
}
这篇关于Spring Security Webflow/反应性异常处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文