This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new a241426e0c fix(sign): forward configured app parameter (#7199)
a241426e0c is described below
commit a241426e0c98965ab2678a78c706a6f71b82be56
Author: Liming Deng <[email protected]>
AuthorDate: Tue Oct 20 14:30:58 2026 +0800
fix(sign): forward configured app parameter (#7199)
---
.../java/org/apache/shenyu/plugin/sign/SignPlugin.java | 13 +++++++++++--
.../plugin/sign/service/ComposableSignService.java | 2 +-
.../org/apache/shenyu/plugin/sign/SignPluginTest.java | 18 +++++++++++++++++-
.../plugin/sign/service/SignServiceVersionTwoTest.java | 2 ++
4 files changed, 31 insertions(+), 4 deletions(-)
diff --git
a/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/SignPlugin.java
b/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/SignPlugin.java
index 5904c4a76c..264b621860 100644
---
a/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/SignPlugin.java
+++
b/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/SignPlugin.java
@@ -17,6 +17,7 @@
package org.apache.shenyu.plugin.sign;
+import org.apache.shenyu.common.constant.Constants;
import org.apache.shenyu.common.dto.RuleData;
import org.apache.shenyu.common.dto.SelectorData;
import org.apache.shenyu.common.enums.PluginEnum;
@@ -77,7 +78,7 @@ public class SignPlugin extends AbstractShenyuPlugin {
return
WebFluxResultUtils.failedResult(ShenyuResultEnum.SIGN_IS_NOT_PASS.getCode(),
result.getReason(), exchange);
}
- return chain.execute(exchange);
+ return chain.execute(addAppParamHeader(exchange));
}
return ServerWebExchangeUtils.rewriteRequestBody(exchange,
messageReaders, body -> {
@@ -86,7 +87,7 @@ public class SignPlugin extends AbstractShenyuPlugin {
return Mono.just(body);
}
throw new
ResponsiveException(ShenyuResultEnum.SIGN_IS_NOT_PASS.getCode(),
result.getReason(), exchange);
- }).flatMap(chain::execute)
+ }).map(this::addAppParamHeader).flatMap(chain::execute)
.onErrorResume(error -> {
if (error instanceof ResponsiveException) {
return
WebFluxResultUtils.failedResult((ResponsiveException) error);
@@ -99,4 +100,12 @@ public class SignPlugin extends AbstractShenyuPlugin {
// get url params
return signService.signatureVerify(exchange, originalBody);
}
+
+ private ServerWebExchange addAppParamHeader(final ServerWebExchange
exchange) {
+ String appParam = exchange.getAttribute(Constants.APP_PARAM);
+ if (ObjectUtils.isEmpty(appParam)) {
+ return exchange;
+ }
+ return exchange.mutate().request(request -> request.headers(headers ->
headers.set(Constants.APP_PARAM, appParam))).build();
+ }
}
diff --git
a/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/service/ComposableSignService.java
b/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/service/ComposableSignService.java
index 17e8e4e1b0..293faef1fc 100644
---
a/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/service/ComposableSignService.java
+++
b/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/service/ComposableSignService.java
@@ -232,7 +232,7 @@ public class ComposableSignService implements SignService {
paramDataList.stream().filter(p ->
p.getAppName().equals(realAppName))
.map(AuthParamData::getAppParam)
.filter(StringUtils::isNoneBlank).findFirst()
- .ifPresent(param ->
exchange.getRequest().mutate().headers(httpHeaders ->
httpHeaders.set(Constants.APP_PARAM, param)).build());
+ .ifPresent(param ->
exchange.getAttributes().put(Constants.APP_PARAM, param));
}
}
diff --git
a/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/test/java/org/apache/shenyu/plugin/sign/SignPluginTest.java
b/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/test/java/org/apache/shenyu/plugin/sign/SignPluginTest.java
index 64268f42b7..4fccaca1d0 100644
---
a/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/test/java/org/apache/shenyu/plugin/sign/SignPluginTest.java
+++
b/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/test/java/org/apache/shenyu/plugin/sign/SignPluginTest.java
@@ -29,16 +29,17 @@ import org.apache.shenyu.plugin.api.utils.SpringBeanUtils;
import org.apache.shenyu.plugin.sign.extractor.DefaultExtractor;
import org.apache.shenyu.plugin.sign.provider.DefaultSignProvider;
import org.apache.shenyu.plugin.sign.service.ComposableSignService;
-import org.apache.shenyu.plugin.sign.service.SignService;
import org.apache.shenyu.plugin.sign.api.VerifyResult;
import org.apache.shenyu.plugin.sign.handler.SignPluginDataHandler;
import org.apache.shenyu.plugin.sign.handler.SignRuleHandler;
+import org.apache.shenyu.plugin.sign.service.SignService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
@@ -150,6 +151,21 @@ public final class SignPluginTest {
StepVerifier.create(signPlugin.doExecute(exchange, chain,
selectorData, data)).expectSubscription().verifyComplete();
}
+ @Test
+ public void testAppParamHeaderIsForwarded() {
+ this.exchange =
MockServerWebExchange.from(MockServerHttpRequest.get("localhost").build());
+ this.exchange.getAttributes().put(Constants.APP_PARAM,
"tenant=shenyu");
+
when(signService.signatureVerify(exchange)).thenReturn(VerifyResult.success());
+ when(chain.execute(any())).thenReturn(Mono.empty());
+
+ StepVerifier.create(signPlugin.doExecute(exchange, chain,
mock(SelectorData.class), mock(RuleData.class)))
+ .expectSubscription().verifyComplete();
+
+ ArgumentCaptor<ServerWebExchange> exchangeCaptor =
ArgumentCaptor.forClass(ServerWebExchange.class);
+ org.mockito.Mockito.verify(chain).execute(exchangeCaptor.capture());
+ assertEquals("tenant=shenyu",
exchangeCaptor.getValue().getRequest().getHeaders().getFirst(Constants.APP_PARAM));
+ }
+
@Test
public void testSignPluginSimple2() {
this.exchange =
MockServerWebExchange.from(MockServerHttpRequest.get("localhost").build());
diff --git
a/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/test/java/org/apache/shenyu/plugin/sign/service/SignServiceVersionTwoTest.java
b/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/test/java/org/apache/shenyu/plugin/sign/service/SignServiceVersionTwoTest.java
index 62d5ff0233..22f83d8947 100644
---
a/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/test/java/org/apache/shenyu/plugin/sign/service/SignServiceVersionTwoTest.java
+++
b/shenyu-plugin/shenyu-plugin-security/shenyu-plugin-sign/src/test/java/org/apache/shenyu/plugin/sign/service/SignServiceVersionTwoTest.java
@@ -103,6 +103,7 @@ public final class SignServiceVersionTwoTest {
authPathData.setPath(path);
authPathData.setEnabled(true);
authData.setPathDataList(Lists.newArrayList(authPathData));
+ authData.setParamDataList(Lists.newArrayList(new
AuthParamData("/test-api", "tenant=shenyu")));
SignAuthDataCache.getInstance().cacheAuthData(authData);
this.passed = new ShenyuContext();
@@ -129,6 +130,7 @@ public final class SignServiceVersionTwoTest {
VerifyResult ret = this.signService.signatureVerify(this.exchange);
assertEquals(ret, VerifyResult.success());
+ assertEquals("tenant=shenyu",
this.exchange.getAttribute(Constants.APP_PARAM));
}
@Test