@Override
    protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selectorData, final RuleData rule) {
        SignRuleHandler ruleHandler = SignPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
        if (ObjectUtils.isEmpty(ruleHandler) || !ruleHandler.getSignRequestBody()) {
            VerifyResult result = signService.signatureVerify(exchange);
            if (result.isFailed()) {
                return WebFluxResultUtils.failedResult(ShenyuResultEnum.SIGN_IS_NOT_PASS.getCode(),
                        result.getReason(), exchange);
            }
            return chain.execute(exchange);
        }

        return ServerWebExchangeUtils.rewriteRequestBody(exchange, messageReaders, body -> {
            VerifyResult result = signVerifyWithBody(body, exchange);
            if (result.isSuccess()) {
                return Mono.just(body);
            }
            throw new ResponsiveException(ShenyuResultEnum.SIGN_IS_NOT_PASS.getCode(), result.getReason(), exchange);
        }).flatMap(chain::execute)
                .onErrorResume(error -> {
                    if (error instanceof ResponsiveException) {
                        return WebFluxResultUtils.failedResult((ResponsiveException) error);
                    }
                    return Mono.error(error);
                });
    }
@Test
    public void testSignPluginSimple() {
        this.exchange = MockServerWebExchange.from(MockServerHttpRequest.get("localhost").build());

        when(signService.signatureVerify(exchange)).thenReturn(VerifyResult.success());
        RuleData data = mock(RuleData.class);
        SelectorData selectorData = mock(SelectorData.class);
        when(chain.execute(exchange)).thenReturn(Mono.empty());
        StepVerifier.create(signPlugin.doExecute(exchange, chain, selectorData, data)).expectSubscription().verifyComplete();
    }