Spring Security Webflow/反应性异常处理 [英] Spring Security Webflux/Reactive Exception Handling

查看:18
本文介绍了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的组件。ErrorWebExceptionHandlerBean的实例在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆