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

Reply via email to