From 1793e77645fdd9b032f932b7a1dd9a90b62af693 Mon Sep 17 00:00:00 2001 From: hhhhsc <1710496817@qq.com> Date: Tue, 25 Aug 2026 17:04:02 +0800 Subject: [PATCH 1/5] Fix knowledge repository pagination to use one-based pages --- .../dto/DataMateKnowledgeListQueryParam.java | 3 +-- .../service/DataMateKnowledgeRepoServiceImpl.java | 2 +- .../MockedDataMateKnowledgeListQueryParam.java | 2 +- .../DataMateKnowledgeRepoServiceImplTest.java | 15 +++++++++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/dto/DataMateKnowledgeListQueryParam.java b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/dto/DataMateKnowledgeListQueryParam.java index 4574efd33..f5e53d1aa 100644 --- a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/dto/DataMateKnowledgeListQueryParam.java +++ b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/dto/DataMateKnowledgeListQueryParam.java @@ -21,7 +21,7 @@ @SerializeStrategy(include = SerializeStrategy.Include.NON_NULL) public class DataMateKnowledgeListQueryParam { /** - * 页码,从0开始。 + * 页码,从1开始。 */ private Integer page; @@ -40,4 +40,3 @@ public class DataMateKnowledgeListQueryParam { */ private String description; } - diff --git a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImpl.java b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImpl.java index bfbe02d53..01fb5760b 100644 --- a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImpl.java +++ b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImpl.java @@ -132,7 +132,7 @@ public List retrieve(String apiKey, FlatKnowledgeOption optio } private PageVoKnowledgeList queryKnowledgeList(String apiKey, ListRepoQueryParam param) { - int page = Math.max(param.getPageIndex() - 1, 0); + int page = Math.max(param.getPageIndex(), 1); int size = param.getPageSize(); DataMateKnowledgeListEntity listEntity = this.executeQuery(apiKey, param.getRepoName(), page, size); List content = listEntity.getContent() == null diff --git a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeListQueryParam.java b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeListQueryParam.java index 6ef86a3c5..820306536 100644 --- a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeListQueryParam.java +++ b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeListQueryParam.java @@ -19,7 +19,7 @@ @SerializeStrategy(include = SerializeStrategy.Include.NON_NULL) public class MockedDataMateKnowledgeListQueryParam { /** - * 页码,从0开始。 + * 页码,从1开始。 */ private Integer page; diff --git a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImplTest.java b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImplTest.java index ac6a83a7b..a1fcd0006 100644 --- a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImplTest.java +++ b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImplTest.java @@ -11,8 +11,10 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import modelengine.fit.jade.datamate.knowledge.dto.DataMateKnowledgeListQueryParam; import modelengine.fit.jade.datamate.knowledge.entity.DataMateKnowledgeEntity; import modelengine.fit.jade.datamate.knowledge.entity.DataMateKnowledgeListEntity; import modelengine.fit.jade.datamate.knowledge.entity.DataMateRetrievalChunksEntity; @@ -36,6 +38,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import java.util.Collections; import java.util.List; @@ -70,7 +73,7 @@ void shouldReturnPageWhenListRepos() { .build(); DataMateKnowledgeListEntity listEntity = DataMateKnowledgeListEntity.builder() - .page(0) + .page(1) .size(10) .totalElements(1) .totalPages(1) @@ -91,13 +94,17 @@ void shouldReturnPageWhenListRepos() { assertThat(result.getItems().get(0)) .extracting(KnowledgeRepo::id, KnowledgeRepo::name, KnowledgeRepo::description, KnowledgeRepo::type) .containsExactly("kb-1", "测试知识库", "描述", "embedding-v1"); + ArgumentCaptor queryParamCaptor = + ArgumentCaptor.forClass(DataMateKnowledgeListQueryParam.class); + verify(knowledgeBaseManager).listRepos(anyString(), queryParamCaptor.capture()); + assertThat(queryParamCaptor.getValue().getPage()).isEqualTo(1); } @Test @DisplayName("listRepos - 列表为空时返回空分页") void shouldReturnEmptyPageWhenContentEmpty() { DataMateKnowledgeListEntity listEntity = DataMateKnowledgeListEntity.builder() - .page(0) + .page(1) .size(10) .totalElements(0) .totalPages(0) @@ -120,7 +127,7 @@ void shouldReturnEmptyPageWhenContentEmpty() { @DisplayName("listRepos - content 为 null 时按空列表处理") void shouldReturnEmptyPageWhenContentNull() { DataMateKnowledgeListEntity listEntity = DataMateKnowledgeListEntity.builder() - .page(0) + .page(1) .size(10) .totalElements(0) .totalPages(0) @@ -143,7 +150,7 @@ void shouldReturnEmptyPageWhenContentNull() { @DisplayName("listRepos - totalElements 为 null 时 total 为 0") void shouldUseZeroTotalWhenTotalElementsNull() { DataMateKnowledgeListEntity listEntity = DataMateKnowledgeListEntity.builder() - .page(0) + .page(1) .size(10) .totalElements(null) .totalPages(null) From 8229cef54e25c1e57158bb09a5e37169e08bcba9 Mon Sep 17 00:00:00 2001 From: hhhhsc <1710496817@qq.com> Date: Tue, 25 Aug 2026 17:31:20 +0800 Subject: [PATCH 2/5] Propagate authentication context to knowledge base requests --- .../DataMateKnowledgeBaseManager.java | 26 ++++++- .../DataMateKnowledgeBaseManagerTest.java | 45 ++++++++++++ ...dDataMateKnowledgeBaseInnerController.java | 58 +++++++++++++-- .../DataMateKnowledgeRepoServiceImplTest.java | 2 + .../common/filter/support/LoginFilter.java | 7 +- .../filter/support/HttpRequestUtilsTest.java | 70 +++++++++++++++++++ .../support/LoginFilterContextTest.java | 69 ++++++++++++++++++ .../context/HttpRequestUtils.java | 45 ++++++++++-- .../authentication/context/UserContext.java | 44 ++++++++++++ 9 files changed, 353 insertions(+), 13 deletions(-) create mode 100644 common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/HttpRequestUtilsTest.java create mode 100644 common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/LoginFilterContextTest.java diff --git a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java index acb7b2f8d..f23997287 100644 --- a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java +++ b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java @@ -8,6 +8,9 @@ import static modelengine.fit.http.protocol.MessageHeaderNames.AUTHORIZATION; import static modelengine.fit.http.protocol.MessageHeaderNames.CONTENT_TYPE; +import static modelengine.jade.authentication.context.HttpRequestUtils.AUTH_TOKEN_KEY; +import static modelengine.jade.authentication.context.HttpRequestUtils.CSRF_TOKEN_KEY; +import static modelengine.jade.authentication.context.HttpRequestUtils.REAL_IP_KEY; import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.AUTHENTICATION_ERROR; import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.CLIENT_REQUEST_ERROR; import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.INTERNAL_SERVICE_ERROR; @@ -15,6 +18,7 @@ import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.QUERY_KNOWLEDGE_ERROR; import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.QUERY_KNOWLEDGE_LIST_ERROR; +import modelengine.fit.http.Cookie; import modelengine.fit.http.client.HttpClassicClient; import modelengine.fit.http.client.HttpClassicClientFactory; import modelengine.fit.http.client.HttpClassicClientRequest; @@ -35,6 +39,8 @@ import modelengine.fitframework.util.MapBuilder; import modelengine.fitframework.util.ObjectUtils; import modelengine.fitframework.util.StringUtils; +import modelengine.jade.authentication.context.UserContext; +import modelengine.jade.authentication.context.UserContextHolder; import modelengine.jade.knowledge.code.KnowledgeManagerRetCode; import modelengine.jade.knowledge.exception.KnowledgeException; @@ -89,6 +95,7 @@ public DataMateKnowledgeListEntity listRepos(String apiKey, DataMateKnowledgeLis if (StringUtils.isNotEmpty(apiKey)) { request.headers().set(AUTHORIZATION, BEARER + apiKey); } + this.addContextCookies(request); try { Object object = this.httpClient.get().exchangeForEntity(request, Object.class); Map response = @@ -118,6 +125,7 @@ public DataMateRetrievalResult retrieve(String apiKey, DataMateRetrievalParam pa if (StringUtils.isNotEmpty(apiKey)) { request.headers().set(AUTHORIZATION, BEARER + apiKey); } + this.addContextCookies(request); request.headers().set(CONTENT_TYPE, CONTENT_TYPE_JSON); try { Object object = this.httpClient.get().exchangeForEntity(request, Object.class); @@ -141,6 +149,23 @@ private KnowledgeException handleException(HttpClientResponseException ex) { return new KnowledgeException(retCode, ex, ex.getSimpleMessage()); } + private void addContextCookies(HttpClassicClientRequest request) { + UserContext context = UserContextHolder.get(); + if (context == null) { + return; + } + this.addCookieIfNotEmpty(request, AUTH_TOKEN_KEY, context.getAuthToken()); + this.addCookieIfNotEmpty(request, CSRF_TOKEN_KEY, context.getCsrfToken()); + this.addCookieIfNotEmpty(request, REAL_IP_KEY, context.getIp()); + } + + private void addCookieIfNotEmpty(HttpClassicClientRequest request, String name, String value) { + if (StringUtils.isEmpty(value)) { + return; + } + request.cookies().add(Cookie.builder().name(name).value(value).build()); + } + private HttpClassicClient getHttpClient() { int timeoutMs = this.timeoutSeconds * 1000; Map custom = MapBuilder.get() @@ -155,4 +180,3 @@ private HttpClassicClient getHttpClient() { .build()); } } - diff --git a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java index d87352438..2e4dae2f5 100644 --- a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java +++ b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java @@ -17,6 +17,8 @@ import modelengine.fit.jade.datamate.knowledge.entity.DataMateRetrievalChunksEntity; import modelengine.fit.jade.datamate.knowledge.entity.DataMateRetrievalResult; import modelengine.fit.jade.datamate.knowledge.external.DataMateKnowledgeBaseManager; +import modelengine.jade.authentication.context.UserContext; +import modelengine.jade.authentication.context.UserContextHolder; import modelengine.jade.knowledge.exception.KnowledgeException; import org.junit.jupiter.api.AfterEach; @@ -31,6 +33,7 @@ import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; /** * 表示 {@link DataMateKnowledgeBaseManager} 的测试集。 @@ -81,6 +84,28 @@ public void shouldOkWhenListRepo() { DataMateKnowledgeEntity::getDescription).containsExactly("2", "test2", "test2知识库"); } + @Test + @DisplayName("查询知识库列表时携带认证 Cookie 和真实 IP") + public void shouldAddContextCookiesWhenListRepo() { + DataMateKnowledgeListQueryParam param = DataMateKnowledgeListQueryParam.builder().name("cookie").build(); + DataMateKnowledgeListEntity entity = this.executeListWithContext(param, + new UserContext("user", "203.0.113.10", "zh-CN", "auth-token", "csrf-token")); + + assertThat(entity.getContent()).hasSize(2); + assertThat(UserContextHolder.get()).isNull(); + } + + @Test + @DisplayName("查询知识库列表时忽略缺失的 Cookie") + public void shouldOmitMissingContextCookiesWhenListRepo() { + DataMateKnowledgeListQueryParam param = + DataMateKnowledgeListQueryParam.builder().name("partial-cookie").build(); + DataMateKnowledgeListEntity entity = this.executeListWithContext(param, + new UserContext("user", "", "zh-CN", "auth-token", null)); + + assertThat(entity.getContent()).hasSize(2); + } + @Test @DisplayName("查询知识库列表失败,抛出异常") public void shouldFailWhenListRepoThrowException() { @@ -100,6 +125,19 @@ public void shouldOkWhenRetrieve() { assertThat(result.getData().get(0).content()).isEqualTo("content1"); } + @Test + @DisplayName("检索知识库时携带认证 Cookie 和真实 IP") + public void shouldAddContextCookiesWhenRetrieve() { + DataMateRetrievalParam param = DataMateRetrievalParam.builder().query("cookie").build(); + AtomicReference result = new AtomicReference<>(); + UserContext context = new UserContext("user", "203.0.113.10", "zh-CN", "auth-token", "csrf-token"); + + UserContextHolder.apply(context, () -> result.set(this.manager.retrieve(this.apiKey, param))); + + assertThat(result.get().getData()).hasSize(3); + assertThat(UserContextHolder.get()).isNull(); + } + @Test @DisplayName("检索知识库失败,抛出异常") public void shouldFailWhenRetrieveThrowException() { @@ -108,4 +146,11 @@ public void shouldFailWhenRetrieveThrowException() { .extracting("code") .isEqualTo(130703005); } + + private DataMateKnowledgeListEntity executeListWithContext(DataMateKnowledgeListQueryParam param, + UserContext context) { + AtomicReference entity = new AtomicReference<>(); + UserContextHolder.apply(context, () -> entity.set(this.manager.listRepos(this.apiKey, param))); + return entity.get(); + } } diff --git a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java index ec9a75caf..694636464 100644 --- a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java +++ b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java @@ -6,12 +6,18 @@ package modelengine.fit.jade.datamate.knowledge; +import static modelengine.fit.http.protocol.MessageHeaderNames.AUTHORIZATION; import static modelengine.fitframework.util.IoUtils.content; +import static modelengine.jade.authentication.context.HttpRequestUtils.AUTH_TOKEN_KEY; +import static modelengine.jade.authentication.context.HttpRequestUtils.CSRF_TOKEN_KEY; +import static modelengine.jade.authentication.context.HttpRequestUtils.REAL_IP_KEY; +import modelengine.fit.http.Cookie; import modelengine.fit.http.annotation.PostMapping; import modelengine.fit.http.annotation.RequestBody; import modelengine.fit.http.annotation.RequestMapping; import modelengine.fit.http.client.HttpClientException; +import modelengine.fit.http.server.HttpClassicServerRequest; import modelengine.fitframework.annotation.Component; import modelengine.fitframework.serialization.ObjectSerializer; import modelengine.fit.jade.datamate.knowledge.entity.DataMateResponse; @@ -28,6 +34,11 @@ @Component @RequestMapping(path = "/v2", group = "DataMate知识库内部接口打桩") public class MockedDataMateKnowledgeBaseInnerController { + private static final String EXPECTED_AUTHORIZATION = "Bearer 123"; + private static final String EXPECTED_AUTH_TOKEN = "auth-token"; + private static final String EXPECTED_CSRF_TOKEN = "csrf-token"; + private static final String EXPECTED_REAL_IP = "203.0.113.10"; + private final ObjectSerializer serializer; public MockedDataMateKnowledgeBaseInnerController(ObjectSerializer serializer) { @@ -35,22 +46,61 @@ public MockedDataMateKnowledgeBaseInnerController(ObjectSerializer serializer) { } @PostMapping(path = "/knowledgeBase") - public Map listRepos(@RequestBody MockedDataMateKnowledgeListQueryParam param) throws IOException { - if (param.getName().equals("error")) { + public Map listRepos(HttpClassicServerRequest request, + @RequestBody MockedDataMateKnowledgeListQueryParam param) throws IOException { + if ("error".equals(param.getName())) { throw new HttpClientException("error"); } + this.validateRequestContext(request, param.getName()); String resourceName = "/listRepoResult.json"; String jsonContent = content(DataMateResponse.class, resourceName); return serializer.deserialize(jsonContent, Map.class); } @PostMapping(path = "/knowledgebases/query") - public Map retrieve(@RequestBody MockedDataMateRetrievalParam param) throws IOException { - if (param.getQuery().equals("error")) { + public Map retrieve(HttpClassicServerRequest request, + @RequestBody MockedDataMateRetrievalParam param) throws IOException { + if ("error".equals(param.getQuery())) { throw new HttpClientException("error"); } + this.validateRequestContext(request, param.getQuery()); String resourceName = "/retrieveResult.json"; String jsonContent = content(DataMateResponse.class, resourceName); return serializer.deserialize(jsonContent, Map.class); } + + private void validateRequestContext(HttpClassicServerRequest request, String testCase) { + this.validate(EXPECTED_AUTHORIZATION.equals(request.headers().first(AUTHORIZATION).orElse(null)), + "The authorization header is incorrect."); + if ("cookie".equals(testCase)) { + this.validateCookie(request, AUTH_TOKEN_KEY, EXPECTED_AUTH_TOKEN); + this.validateCookie(request, CSRF_TOKEN_KEY, EXPECTED_CSRF_TOKEN); + this.validateCookie(request, REAL_IP_KEY, EXPECTED_REAL_IP); + return; + } + if ("partial-cookie".equals(testCase)) { + this.validateCookie(request, AUTH_TOKEN_KEY, EXPECTED_AUTH_TOKEN); + this.validateMissingCookie(request, CSRF_TOKEN_KEY); + this.validateMissingCookie(request, REAL_IP_KEY); + return; + } + this.validateMissingCookie(request, AUTH_TOKEN_KEY); + this.validateMissingCookie(request, CSRF_TOKEN_KEY); + this.validateMissingCookie(request, REAL_IP_KEY); + } + + private void validateCookie(HttpClassicServerRequest request, String name, String expectedValue) { + String actualValue = request.cookies().get(name).map(Cookie::value).orElse(null); + this.validate(expectedValue.equals(actualValue), "The cookie is incorrect: " + name); + } + + private void validateMissingCookie(HttpClassicServerRequest request, String name) { + this.validate(request.cookies().get(name).isEmpty(), "The cookie should be absent: " + name); + } + + private void validate(boolean expression, String message) { + if (!expression) { + throw new HttpClientException(message); + } + } } diff --git a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImplTest.java b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImplTest.java index a1fcd0006..db9a27b7a 100644 --- a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImplTest.java +++ b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/service/DataMateKnowledgeRepoServiceImplTest.java @@ -10,6 +10,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -86,6 +87,7 @@ void shouldReturnPageWhenListRepos() { param.setRepoName("test"); when(knowledgeBaseManager.listRepos(anyString(), any())).thenReturn(listEntity); + clearInvocations(knowledgeBaseManager); PageVo result = knowledgeRepoService.listRepos(API_KEY, param); diff --git a/common/plugins/http-interceptor/src/main/java/modelengine/jade/common/filter/support/LoginFilter.java b/common/plugins/http-interceptor/src/main/java/modelengine/jade/common/filter/support/LoginFilter.java index cfa7d2284..4d962985d 100644 --- a/common/plugins/http-interceptor/src/main/java/modelengine/jade/common/filter/support/LoginFilter.java +++ b/common/plugins/http-interceptor/src/main/java/modelengine/jade/common/filter/support/LoginFilter.java @@ -6,6 +6,9 @@ package modelengine.jade.common.filter.support; +import static modelengine.jade.authentication.context.HttpRequestUtils.AUTH_TOKEN_KEY; +import static modelengine.jade.authentication.context.HttpRequestUtils.CSRF_TOKEN_KEY; + import modelengine.fit.http.protocol.HttpRequestMethod; import modelengine.fit.http.server.HttpClassicServerRequest; import modelengine.fit.http.server.HttpClassicServerResponse; @@ -73,7 +76,9 @@ public void doFilter(HttpClassicServerRequest request, HttpClassicServerResponse } UserContext operationContext = new UserContext(this.authenticationService.getUserName(request), HttpRequestUtils.getUserIp(request), - HttpRequestUtils.getAcceptLanguages(request)); + HttpRequestUtils.getAcceptLanguages(request), + HttpRequestUtils.getCookieValue(request, AUTH_TOKEN_KEY), + HttpRequestUtils.getCookieValue(request, CSRF_TOKEN_KEY)); UserContextHolder.apply(operationContext, () -> chain.doFilter(request, response)); } diff --git a/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/HttpRequestUtilsTest.java b/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/HttpRequestUtilsTest.java new file mode 100644 index 000000000..d74b718db --- /dev/null +++ b/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/HttpRequestUtilsTest.java @@ -0,0 +1,70 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. + * This file is a part of the ModelEngine Project. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +package modelengine.jade.common.filter.support; + +import static modelengine.jade.authentication.context.HttpRequestUtils.REAL_IP_KEY; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import modelengine.fit.http.protocol.Address; +import modelengine.fit.http.protocol.support.DefaultMessageHeaders; +import modelengine.fit.http.server.HttpClassicServerRequest; +import modelengine.jade.authentication.context.HttpRequestUtils; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * 表示 {@link HttpRequestUtils} 的测试集。 + * + * @author 陈镕希 + * @since 2026-08-25 + */ +class HttpRequestUtilsTest { + @Test + @DisplayName("X-Real-IP 优先于其他 IP 请求头") + void shouldPreferRealIp() { + DefaultMessageHeaders headers = new DefaultMessageHeaders(); + headers.add("X-Forwarded-For", "198.51.100.1"); + headers.add(REAL_IP_KEY, "203.0.113.1"); + + assertThat(HttpRequestUtils.getUserIp(this.mockRequest(headers, "127.0.0.1"))) + .isEqualTo("203.0.113.1"); + } + + @Test + @DisplayName("X-Forwarded-For 返回第一个有效 IP") + void shouldUseFirstKnownForwardedIp() { + DefaultMessageHeaders headers = new DefaultMessageHeaders(); + headers.add(REAL_IP_KEY, "unknown"); + headers.add("X-Forwarded-For", "unknown, , 198.51.100.2, 198.51.100.3"); + + assertThat(HttpRequestUtils.getUserIp(this.mockRequest(headers, "127.0.0.1"))) + .isEqualTo("198.51.100.2"); + } + + @Test + @DisplayName("请求头为空或 unknown 时使用远端 IP") + void shouldFallbackToRemoteIp() { + DefaultMessageHeaders headers = new DefaultMessageHeaders(); + headers.add(REAL_IP_KEY, " "); + headers.add("X-Forwarded-For", "unknown"); + headers.add("Proxy-Client-IP", ""); + headers.add("WL-Proxy-Client-IP", "unknown"); + + assertThat(HttpRequestUtils.getUserIp(this.mockRequest(headers, "127.0.0.1"))) + .isEqualTo("127.0.0.1"); + } + + private HttpClassicServerRequest mockRequest(DefaultMessageHeaders headers, String remoteIp) { + HttpClassicServerRequest request = mock(HttpClassicServerRequest.class); + when(request.headers()).thenReturn(headers); + when(request.remoteAddress()).thenReturn(Address.builder().hostAddress(remoteIp).port(8080).build()); + return request; + } +} diff --git a/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/LoginFilterContextTest.java b/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/LoginFilterContextTest.java new file mode 100644 index 000000000..45b9b1246 --- /dev/null +++ b/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/LoginFilterContextTest.java @@ -0,0 +1,69 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. + * This file is a part of the ModelEngine Project. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +package modelengine.jade.common.filter.support; + +import static modelengine.jade.authentication.context.HttpRequestUtils.AUTH_TOKEN_KEY; +import static modelengine.jade.authentication.context.HttpRequestUtils.CSRF_TOKEN_KEY; +import static modelengine.jade.authentication.context.HttpRequestUtils.REAL_IP_KEY; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import modelengine.fit.http.Cookie; +import modelengine.fit.http.protocol.support.DefaultMessageHeaders; +import modelengine.fit.http.server.HttpClassicServerRequest; +import modelengine.fit.http.server.HttpClassicServerResponse; +import modelengine.fit.http.server.HttpServerFilterChain; +import modelengine.fit.http.support.DefaultCookieCollection; +import modelengine.jade.authentication.AuthenticationService; +import modelengine.jade.authentication.context.UserContext; +import modelengine.jade.authentication.context.UserContextHolder; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * 表示 {@link LoginFilter} 请求上下文的测试集。 + * + * @author 陈镕希 + * @since 2026-08-25 + */ +class LoginFilterContextTest { + @Test + @DisplayName("登录过滤器保存认证 Cookie 和真实 IP 并在请求后清理上下文") + void shouldSetAndClearAuthenticationContext() { + AuthenticationService authenticationService = mock(AuthenticationService.class); + HttpClassicServerRequest request = mock(HttpClassicServerRequest.class); + HttpClassicServerResponse response = mock(HttpClassicServerResponse.class); + HttpServerFilterChain chain = mock(HttpServerFilterChain.class); + DefaultMessageHeaders headers = new DefaultMessageHeaders(); + headers.add(REAL_IP_KEY, "203.0.113.10"); + DefaultCookieCollection cookies = new DefaultCookieCollection(); + cookies.add(Cookie.builder().name(AUTH_TOKEN_KEY).value("auth-token").build()); + cookies.add(Cookie.builder().name(CSRF_TOKEN_KEY).value("csrf-token").build()); + when(request.headers()).thenReturn(headers); + when(request.cookies()).thenReturn(cookies); + when(request.requestUri()).thenReturn("/knowledge-manager/list/repos"); + when(authenticationService.getUserName(request)).thenReturn("user"); + doAnswer(invocation -> { + UserContext context = UserContextHolder.get(); + assertThat(context).isNotNull(); + assertThat(context.getName()).isEqualTo("user"); + assertThat(context.getIp()).isEqualTo("203.0.113.10"); + assertThat(context.getAuthToken()).isEqualTo("auth-token"); + assertThat(context.getCsrfToken()).isEqualTo("csrf-token"); + return null; + }).when(chain).doFilter(request, response); + + new LoginFilter(authenticationService).doFilter(request, response, chain); + + verify(chain).doFilter(request, response); + assertThat(UserContextHolder.get()).isNull(); + } +} diff --git a/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/HttpRequestUtils.java b/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/HttpRequestUtils.java index 0478cef85..3ce8e884f 100644 --- a/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/HttpRequestUtils.java +++ b/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/HttpRequestUtils.java @@ -23,6 +23,15 @@ * @since 2024-08-07 */ public class HttpRequestUtils { + /** 认证令牌 Cookie 名称。 */ + public static final String AUTH_TOKEN_KEY = "__Host-X-Auth-Token"; + + /** CSRF 令牌 Cookie 名称。 */ + public static final String CSRF_TOKEN_KEY = "__Host-X-Csrf-Token"; + + /** 真实 IP 请求头和 Cookie 名称。 */ + public static final String REAL_IP_KEY = "X-Real-IP"; + private static final String UNKNOWN_IP = "unknown"; /** @@ -47,7 +56,8 @@ public static String getAcceptLanguages(HttpClassicServerRequest request) { * @return 表示用户 ip 的{@link String}。 */ public static String getUserIp(HttpClassicServerRequest request) { - return compute(Arrays.asList(HttpRequestUtils::getForwardedIp, + return compute(Arrays.asList(HttpRequestUtils::getRealIp, + HttpRequestUtils::getForwardedIp, HttpRequestUtils::getProxyClientIp, HttpRequestUtils::getWlProxyClientIp, HttpRequestUtils::getHttpClientIp, @@ -70,6 +80,17 @@ public static Optional header(HttpClassicServerRequest request, String n .flatMap(request.headers()::first); } + /** + * 获取 Cookie 值。 + * + * @param request 表示请求的 {@link HttpClassicServerRequest}。 + * @param name 表示 Cookie 名称的 {@link String}。 + * @return 表示 Cookie 值的 {@link String}。 + */ + public static String getCookieValue(HttpClassicServerRequest request, String name) { + return request.cookies().get(name).map(Cookie::value).orElse(StringUtils.EMPTY); + } + private static String compute(List>> mappers, HttpClassicServerRequest request) { Optional optional = Optional.empty(); @@ -79,7 +100,13 @@ private static String compute(List request.remoteAddress().hostAddress()); + return optional.orElseGet(() -> Optional.ofNullable(request.remoteAddress()) + .map(address -> address.hostAddress()) + .orElse(StringUtils.EMPTY)); + } + + private static Optional getRealIp(HttpClassicServerRequest request) { + return getSingleIpFromHeader(request, REAL_IP_KEY); } private static Optional getForwardedIp(HttpClassicServerRequest request) { @@ -93,22 +120,26 @@ private static Optional getForwardedIp(HttpClassicServerRequest request) } private static Optional getProxyClientIp(HttpClassicServerRequest request) { - return header(request, "Proxy-Client-IP").filter(HttpRequestUtils::knownIp); + return getSingleIpFromHeader(request, "Proxy-Client-IP"); } private static Optional getWlProxyClientIp(HttpClassicServerRequest request) { - return header(request, "WL-Proxy-Client-IP").filter(HttpRequestUtils::knownIp); + return getSingleIpFromHeader(request, "WL-Proxy-Client-IP"); } private static Optional getHttpClientIp(HttpClassicServerRequest request) { - return header(request, "HTTP_CLIENT_IP").filter(HttpRequestUtils::knownIp); + return getSingleIpFromHeader(request, "HTTP_CLIENT_IP"); } private static Optional getHttpForwardedFor(HttpClassicServerRequest request) { - return header(request, "HTTP_X_FORWARDED_FOR").filter(HttpRequestUtils::knownIp); + return getSingleIpFromHeader(request, "HTTP_X_FORWARDED_FOR"); + } + + private static Optional getSingleIpFromHeader(HttpClassicServerRequest request, String name) { + return header(request, name).map(StringUtils::trim).filter(HttpRequestUtils::knownIp); } private static boolean knownIp(String ip) { - return !StringUtils.equalsIgnoreCase(ip, UNKNOWN_IP); + return StringUtils.isNotEmpty(ip) && !StringUtils.equalsIgnoreCase(ip, UNKNOWN_IP); } } diff --git a/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/UserContext.java b/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/UserContext.java index 28524dda8..9f62790db 100644 --- a/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/UserContext.java +++ b/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/UserContext.java @@ -16,11 +16,19 @@ public class UserContext { private String name; private String ip; private String language; + private String authToken; + private String csrfToken; public UserContext(String name, String ip, String language) { + this(name, ip, language, null, null); + } + + public UserContext(String name, String ip, String language, String authToken, String csrfToken) { this.name = name; this.ip = ip; this.language = language; + this.authToken = authToken; + this.csrfToken = csrfToken; } /** @@ -76,4 +84,40 @@ public void setLanguage(String language) { public String getLanguage() { return language; } + + /** + * 设置认证令牌。 + * + * @param authToken 表示认证令牌的 {@link String}。 + */ + public void setAuthToken(String authToken) { + this.authToken = authToken; + } + + /** + * 获取认证令牌。 + * + * @return 表示认证令牌的 {@link String}。 + */ + public String getAuthToken() { + return this.authToken; + } + + /** + * 设置 CSRF 令牌。 + * + * @param csrfToken 表示 CSRF 令牌的 {@link String}。 + */ + public void setCsrfToken(String csrfToken) { + this.csrfToken = csrfToken; + } + + /** + * 获取 CSRF 令牌。 + * + * @return 表示 CSRF 令牌的 {@link String}。 + */ + public String getCsrfToken() { + return this.csrfToken; + } } From 19ddd0ae843802661b1857205fb026d036dc1b1e Mon Sep 17 00:00:00 2001 From: hhhhsc <1710496817@qq.com> Date: Wed, 26 Aug 2026 11:59:06 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/data-mate-knowledge/pom.xml | 2 +- .../DataMateKnowledgeBaseManager.java | 24 ++----- .../src/main/resources/application.yml | 5 +- .../DataMateKnowledgeBaseManagerTest.java | 24 +++---- ...dDataMateKnowledgeBaseInnerController.java | 35 ++-------- .../common/filter/support/LoginFilter.java | 7 +- .../filter/support/HttpRequestUtilsTest.java | 70 ------------------- .../support/LoginFilterContextTest.java | 69 ------------------ .../context/HttpRequestUtils.java | 45 ++---------- .../authentication/context/UserContext.java | 44 ------------ 10 files changed, 35 insertions(+), 290 deletions(-) delete mode 100644 common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/HttpRequestUtilsTest.java delete mode 100644 common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/LoginFilterContextTest.java diff --git a/app-builder/plugins/data-mate-knowledge/pom.xml b/app-builder/plugins/data-mate-knowledge/pom.xml index 1a637780c..ce7358c12 100644 --- a/app-builder/plugins/data-mate-knowledge/pom.xml +++ b/app-builder/plugins/data-mate-knowledge/pom.xml @@ -139,4 +139,4 @@ - \ No newline at end of file + diff --git a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java index f23997287..d31010a68 100644 --- a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java +++ b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java @@ -8,9 +8,6 @@ import static modelengine.fit.http.protocol.MessageHeaderNames.AUTHORIZATION; import static modelengine.fit.http.protocol.MessageHeaderNames.CONTENT_TYPE; -import static modelengine.jade.authentication.context.HttpRequestUtils.AUTH_TOKEN_KEY; -import static modelengine.jade.authentication.context.HttpRequestUtils.CSRF_TOKEN_KEY; -import static modelengine.jade.authentication.context.HttpRequestUtils.REAL_IP_KEY; import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.AUTHENTICATION_ERROR; import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.CLIENT_REQUEST_ERROR; import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.INTERNAL_SERVICE_ERROR; @@ -18,7 +15,6 @@ import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.QUERY_KNOWLEDGE_ERROR; import static modelengine.jade.knowledge.code.KnowledgeManagerRetCode.QUERY_KNOWLEDGE_LIST_ERROR; -import modelengine.fit.http.Cookie; import modelengine.fit.http.client.HttpClassicClient; import modelengine.fit.http.client.HttpClassicClientFactory; import modelengine.fit.http.client.HttpClassicClientRequest; @@ -58,6 +54,7 @@ public class DataMateKnowledgeBaseManager { private static final Logger log = Logger.get(DataMateKnowledgeBaseManager.class); private static final String BEARER = "Bearer "; private static final String CONTENT_TYPE_JSON = "application/json"; + private static final String USER_HEADER = "User"; /** 默认访问超时时间(秒)。 */ private static final int DEFAULT_TIMEOUT_SECONDS = 30; @@ -95,7 +92,7 @@ public DataMateKnowledgeListEntity listRepos(String apiKey, DataMateKnowledgeLis if (StringUtils.isNotEmpty(apiKey)) { request.headers().set(AUTHORIZATION, BEARER + apiKey); } - this.addContextCookies(request); + this.addUserHeader(request); try { Object object = this.httpClient.get().exchangeForEntity(request, Object.class); Map response = @@ -125,7 +122,7 @@ public DataMateRetrievalResult retrieve(String apiKey, DataMateRetrievalParam pa if (StringUtils.isNotEmpty(apiKey)) { request.headers().set(AUTHORIZATION, BEARER + apiKey); } - this.addContextCookies(request); + this.addUserHeader(request); request.headers().set(CONTENT_TYPE, CONTENT_TYPE_JSON); try { Object object = this.httpClient.get().exchangeForEntity(request, Object.class); @@ -149,21 +146,12 @@ private KnowledgeException handleException(HttpClientResponseException ex) { return new KnowledgeException(retCode, ex, ex.getSimpleMessage()); } - private void addContextCookies(HttpClassicClientRequest request) { + private void addUserHeader(HttpClassicClientRequest request) { UserContext context = UserContextHolder.get(); - if (context == null) { + if (context == null || StringUtils.isEmpty(context.getName())) { return; } - this.addCookieIfNotEmpty(request, AUTH_TOKEN_KEY, context.getAuthToken()); - this.addCookieIfNotEmpty(request, CSRF_TOKEN_KEY, context.getCsrfToken()); - this.addCookieIfNotEmpty(request, REAL_IP_KEY, context.getIp()); - } - - private void addCookieIfNotEmpty(HttpClassicClientRequest request, String name, String value) { - if (StringUtils.isEmpty(value)) { - return; - } - request.cookies().add(Cookie.builder().name(name).value(value).build()); + request.headers().set(USER_HEADER, context.getName()); } private HttpClassicClient getHttpClient() { diff --git a/app-builder/plugins/data-mate-knowledge/src/main/resources/application.yml b/app-builder/plugins/data-mate-knowledge/src/main/resources/application.yml index 420680ee6..e79d4b3a0 100644 --- a/app-builder/plugins/data-mate-knowledge/src/main/resources/application.yml +++ b/app-builder/plugins/data-mate-knowledge/src/main/resources/application.yml @@ -6,7 +6,6 @@ fit: # timeout: 访问超时时间(秒),默认 30,可按场景自定义 datamate: url: - list: 'http://datamate-gateway:8080/api/knowledge-base/list' - retrieve: 'http://datamate-gateway:8080/api/knowledge-base/retrieve' + list: 'http://datamate-backend-python:18000/api/knowledge-base/list' + retrieve: 'http://datamate-backend-python:18000/api/knowledge-base/retrieve' # timeout: 30 - diff --git a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java index 2e4dae2f5..d39ded0b4 100644 --- a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java +++ b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java @@ -85,23 +85,23 @@ public void shouldOkWhenListRepo() { } @Test - @DisplayName("查询知识库列表时携带认证 Cookie 和真实 IP") - public void shouldAddContextCookiesWhenListRepo() { - DataMateKnowledgeListQueryParam param = DataMateKnowledgeListQueryParam.builder().name("cookie").build(); + @DisplayName("查询知识库列表时携带 User 请求头") + public void shouldAddUserHeaderWhenListRepo() { + DataMateKnowledgeListQueryParam param = DataMateKnowledgeListQueryParam.builder().name("user").build(); DataMateKnowledgeListEntity entity = this.executeListWithContext(param, - new UserContext("user", "203.0.113.10", "zh-CN", "auth-token", "csrf-token")); + new UserContext("test-user", "", "")); assertThat(entity.getContent()).hasSize(2); assertThat(UserContextHolder.get()).isNull(); } @Test - @DisplayName("查询知识库列表时忽略缺失的 Cookie") - public void shouldOmitMissingContextCookiesWhenListRepo() { + @DisplayName("用户名缺失时不添加 User 请求头") + public void shouldOmitUserHeaderWhenUserNameMissing() { DataMateKnowledgeListQueryParam param = - DataMateKnowledgeListQueryParam.builder().name("partial-cookie").build(); + DataMateKnowledgeListQueryParam.builder().name("missing-user").build(); DataMateKnowledgeListEntity entity = this.executeListWithContext(param, - new UserContext("user", "", "zh-CN", "auth-token", null)); + new UserContext("", "", "")); assertThat(entity.getContent()).hasSize(2); } @@ -126,11 +126,11 @@ public void shouldOkWhenRetrieve() { } @Test - @DisplayName("检索知识库时携带认证 Cookie 和真实 IP") - public void shouldAddContextCookiesWhenRetrieve() { - DataMateRetrievalParam param = DataMateRetrievalParam.builder().query("cookie").build(); + @DisplayName("检索知识库时携带 User 请求头") + public void shouldAddUserHeaderWhenRetrieve() { + DataMateRetrievalParam param = DataMateRetrievalParam.builder().query("user").build(); AtomicReference result = new AtomicReference<>(); - UserContext context = new UserContext("user", "203.0.113.10", "zh-CN", "auth-token", "csrf-token"); + UserContext context = new UserContext("test-user", "", ""); UserContextHolder.apply(context, () -> result.set(this.manager.retrieve(this.apiKey, param))); diff --git a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java index 694636464..208ceda20 100644 --- a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java +++ b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java @@ -8,11 +8,7 @@ import static modelengine.fit.http.protocol.MessageHeaderNames.AUTHORIZATION; import static modelengine.fitframework.util.IoUtils.content; -import static modelengine.jade.authentication.context.HttpRequestUtils.AUTH_TOKEN_KEY; -import static modelengine.jade.authentication.context.HttpRequestUtils.CSRF_TOKEN_KEY; -import static modelengine.jade.authentication.context.HttpRequestUtils.REAL_IP_KEY; -import modelengine.fit.http.Cookie; import modelengine.fit.http.annotation.PostMapping; import modelengine.fit.http.annotation.RequestBody; import modelengine.fit.http.annotation.RequestMapping; @@ -34,10 +30,9 @@ @Component @RequestMapping(path = "/v2", group = "DataMate知识库内部接口打桩") public class MockedDataMateKnowledgeBaseInnerController { + private static final String USER_HEADER = "User"; private static final String EXPECTED_AUTHORIZATION = "Bearer 123"; - private static final String EXPECTED_AUTH_TOKEN = "auth-token"; - private static final String EXPECTED_CSRF_TOKEN = "csrf-token"; - private static final String EXPECTED_REAL_IP = "203.0.113.10"; + private static final String EXPECTED_USER = "test-user"; private final ObjectSerializer serializer; @@ -72,30 +67,12 @@ public Map retrieve(HttpClassicServerRequest request, private void validateRequestContext(HttpClassicServerRequest request, String testCase) { this.validate(EXPECTED_AUTHORIZATION.equals(request.headers().first(AUTHORIZATION).orElse(null)), "The authorization header is incorrect."); - if ("cookie".equals(testCase)) { - this.validateCookie(request, AUTH_TOKEN_KEY, EXPECTED_AUTH_TOKEN); - this.validateCookie(request, CSRF_TOKEN_KEY, EXPECTED_CSRF_TOKEN); - this.validateCookie(request, REAL_IP_KEY, EXPECTED_REAL_IP); + if ("user".equals(testCase)) { + this.validate(EXPECTED_USER.equals(request.headers().first(USER_HEADER).orElse(null)), + "The User header is incorrect."); return; } - if ("partial-cookie".equals(testCase)) { - this.validateCookie(request, AUTH_TOKEN_KEY, EXPECTED_AUTH_TOKEN); - this.validateMissingCookie(request, CSRF_TOKEN_KEY); - this.validateMissingCookie(request, REAL_IP_KEY); - return; - } - this.validateMissingCookie(request, AUTH_TOKEN_KEY); - this.validateMissingCookie(request, CSRF_TOKEN_KEY); - this.validateMissingCookie(request, REAL_IP_KEY); - } - - private void validateCookie(HttpClassicServerRequest request, String name, String expectedValue) { - String actualValue = request.cookies().get(name).map(Cookie::value).orElse(null); - this.validate(expectedValue.equals(actualValue), "The cookie is incorrect: " + name); - } - - private void validateMissingCookie(HttpClassicServerRequest request, String name) { - this.validate(request.cookies().get(name).isEmpty(), "The cookie should be absent: " + name); + this.validate(request.headers().first(USER_HEADER).isEmpty(), "The User header should be absent."); } private void validate(boolean expression, String message) { diff --git a/common/plugins/http-interceptor/src/main/java/modelengine/jade/common/filter/support/LoginFilter.java b/common/plugins/http-interceptor/src/main/java/modelengine/jade/common/filter/support/LoginFilter.java index 4d962985d..cfa7d2284 100644 --- a/common/plugins/http-interceptor/src/main/java/modelengine/jade/common/filter/support/LoginFilter.java +++ b/common/plugins/http-interceptor/src/main/java/modelengine/jade/common/filter/support/LoginFilter.java @@ -6,9 +6,6 @@ package modelengine.jade.common.filter.support; -import static modelengine.jade.authentication.context.HttpRequestUtils.AUTH_TOKEN_KEY; -import static modelengine.jade.authentication.context.HttpRequestUtils.CSRF_TOKEN_KEY; - import modelengine.fit.http.protocol.HttpRequestMethod; import modelengine.fit.http.server.HttpClassicServerRequest; import modelengine.fit.http.server.HttpClassicServerResponse; @@ -76,9 +73,7 @@ public void doFilter(HttpClassicServerRequest request, HttpClassicServerResponse } UserContext operationContext = new UserContext(this.authenticationService.getUserName(request), HttpRequestUtils.getUserIp(request), - HttpRequestUtils.getAcceptLanguages(request), - HttpRequestUtils.getCookieValue(request, AUTH_TOKEN_KEY), - HttpRequestUtils.getCookieValue(request, CSRF_TOKEN_KEY)); + HttpRequestUtils.getAcceptLanguages(request)); UserContextHolder.apply(operationContext, () -> chain.doFilter(request, response)); } diff --git a/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/HttpRequestUtilsTest.java b/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/HttpRequestUtilsTest.java deleted file mode 100644 index d74b718db..000000000 --- a/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/HttpRequestUtilsTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. - * This file is a part of the ModelEngine Project. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -package modelengine.jade.common.filter.support; - -import static modelengine.jade.authentication.context.HttpRequestUtils.REAL_IP_KEY; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import modelengine.fit.http.protocol.Address; -import modelengine.fit.http.protocol.support.DefaultMessageHeaders; -import modelengine.fit.http.server.HttpClassicServerRequest; -import modelengine.jade.authentication.context.HttpRequestUtils; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -/** - * 表示 {@link HttpRequestUtils} 的测试集。 - * - * @author 陈镕希 - * @since 2026-08-25 - */ -class HttpRequestUtilsTest { - @Test - @DisplayName("X-Real-IP 优先于其他 IP 请求头") - void shouldPreferRealIp() { - DefaultMessageHeaders headers = new DefaultMessageHeaders(); - headers.add("X-Forwarded-For", "198.51.100.1"); - headers.add(REAL_IP_KEY, "203.0.113.1"); - - assertThat(HttpRequestUtils.getUserIp(this.mockRequest(headers, "127.0.0.1"))) - .isEqualTo("203.0.113.1"); - } - - @Test - @DisplayName("X-Forwarded-For 返回第一个有效 IP") - void shouldUseFirstKnownForwardedIp() { - DefaultMessageHeaders headers = new DefaultMessageHeaders(); - headers.add(REAL_IP_KEY, "unknown"); - headers.add("X-Forwarded-For", "unknown, , 198.51.100.2, 198.51.100.3"); - - assertThat(HttpRequestUtils.getUserIp(this.mockRequest(headers, "127.0.0.1"))) - .isEqualTo("198.51.100.2"); - } - - @Test - @DisplayName("请求头为空或 unknown 时使用远端 IP") - void shouldFallbackToRemoteIp() { - DefaultMessageHeaders headers = new DefaultMessageHeaders(); - headers.add(REAL_IP_KEY, " "); - headers.add("X-Forwarded-For", "unknown"); - headers.add("Proxy-Client-IP", ""); - headers.add("WL-Proxy-Client-IP", "unknown"); - - assertThat(HttpRequestUtils.getUserIp(this.mockRequest(headers, "127.0.0.1"))) - .isEqualTo("127.0.0.1"); - } - - private HttpClassicServerRequest mockRequest(DefaultMessageHeaders headers, String remoteIp) { - HttpClassicServerRequest request = mock(HttpClassicServerRequest.class); - when(request.headers()).thenReturn(headers); - when(request.remoteAddress()).thenReturn(Address.builder().hostAddress(remoteIp).port(8080).build()); - return request; - } -} diff --git a/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/LoginFilterContextTest.java b/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/LoginFilterContextTest.java deleted file mode 100644 index 45b9b1246..000000000 --- a/common/plugins/http-interceptor/src/test/java/modelengine/jade/common/filter/support/LoginFilterContextTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. - * This file is a part of the ModelEngine Project. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -package modelengine.jade.common.filter.support; - -import static modelengine.jade.authentication.context.HttpRequestUtils.AUTH_TOKEN_KEY; -import static modelengine.jade.authentication.context.HttpRequestUtils.CSRF_TOKEN_KEY; -import static modelengine.jade.authentication.context.HttpRequestUtils.REAL_IP_KEY; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import modelengine.fit.http.Cookie; -import modelengine.fit.http.protocol.support.DefaultMessageHeaders; -import modelengine.fit.http.server.HttpClassicServerRequest; -import modelengine.fit.http.server.HttpClassicServerResponse; -import modelengine.fit.http.server.HttpServerFilterChain; -import modelengine.fit.http.support.DefaultCookieCollection; -import modelengine.jade.authentication.AuthenticationService; -import modelengine.jade.authentication.context.UserContext; -import modelengine.jade.authentication.context.UserContextHolder; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -/** - * 表示 {@link LoginFilter} 请求上下文的测试集。 - * - * @author 陈镕希 - * @since 2026-08-25 - */ -class LoginFilterContextTest { - @Test - @DisplayName("登录过滤器保存认证 Cookie 和真实 IP 并在请求后清理上下文") - void shouldSetAndClearAuthenticationContext() { - AuthenticationService authenticationService = mock(AuthenticationService.class); - HttpClassicServerRequest request = mock(HttpClassicServerRequest.class); - HttpClassicServerResponse response = mock(HttpClassicServerResponse.class); - HttpServerFilterChain chain = mock(HttpServerFilterChain.class); - DefaultMessageHeaders headers = new DefaultMessageHeaders(); - headers.add(REAL_IP_KEY, "203.0.113.10"); - DefaultCookieCollection cookies = new DefaultCookieCollection(); - cookies.add(Cookie.builder().name(AUTH_TOKEN_KEY).value("auth-token").build()); - cookies.add(Cookie.builder().name(CSRF_TOKEN_KEY).value("csrf-token").build()); - when(request.headers()).thenReturn(headers); - when(request.cookies()).thenReturn(cookies); - when(request.requestUri()).thenReturn("/knowledge-manager/list/repos"); - when(authenticationService.getUserName(request)).thenReturn("user"); - doAnswer(invocation -> { - UserContext context = UserContextHolder.get(); - assertThat(context).isNotNull(); - assertThat(context.getName()).isEqualTo("user"); - assertThat(context.getIp()).isEqualTo("203.0.113.10"); - assertThat(context.getAuthToken()).isEqualTo("auth-token"); - assertThat(context.getCsrfToken()).isEqualTo("csrf-token"); - return null; - }).when(chain).doFilter(request, response); - - new LoginFilter(authenticationService).doFilter(request, response, chain); - - verify(chain).doFilter(request, response); - assertThat(UserContextHolder.get()).isNull(); - } -} diff --git a/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/HttpRequestUtils.java b/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/HttpRequestUtils.java index 3ce8e884f..0478cef85 100644 --- a/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/HttpRequestUtils.java +++ b/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/HttpRequestUtils.java @@ -23,15 +23,6 @@ * @since 2024-08-07 */ public class HttpRequestUtils { - /** 认证令牌 Cookie 名称。 */ - public static final String AUTH_TOKEN_KEY = "__Host-X-Auth-Token"; - - /** CSRF 令牌 Cookie 名称。 */ - public static final String CSRF_TOKEN_KEY = "__Host-X-Csrf-Token"; - - /** 真实 IP 请求头和 Cookie 名称。 */ - public static final String REAL_IP_KEY = "X-Real-IP"; - private static final String UNKNOWN_IP = "unknown"; /** @@ -56,8 +47,7 @@ public static String getAcceptLanguages(HttpClassicServerRequest request) { * @return 表示用户 ip 的{@link String}。 */ public static String getUserIp(HttpClassicServerRequest request) { - return compute(Arrays.asList(HttpRequestUtils::getRealIp, - HttpRequestUtils::getForwardedIp, + return compute(Arrays.asList(HttpRequestUtils::getForwardedIp, HttpRequestUtils::getProxyClientIp, HttpRequestUtils::getWlProxyClientIp, HttpRequestUtils::getHttpClientIp, @@ -80,17 +70,6 @@ public static Optional header(HttpClassicServerRequest request, String n .flatMap(request.headers()::first); } - /** - * 获取 Cookie 值。 - * - * @param request 表示请求的 {@link HttpClassicServerRequest}。 - * @param name 表示 Cookie 名称的 {@link String}。 - * @return 表示 Cookie 值的 {@link String}。 - */ - public static String getCookieValue(HttpClassicServerRequest request, String name) { - return request.cookies().get(name).map(Cookie::value).orElse(StringUtils.EMPTY); - } - private static String compute(List>> mappers, HttpClassicServerRequest request) { Optional optional = Optional.empty(); @@ -100,13 +79,7 @@ private static String compute(List Optional.ofNullable(request.remoteAddress()) - .map(address -> address.hostAddress()) - .orElse(StringUtils.EMPTY)); - } - - private static Optional getRealIp(HttpClassicServerRequest request) { - return getSingleIpFromHeader(request, REAL_IP_KEY); + return optional.orElseGet(() -> request.remoteAddress().hostAddress()); } private static Optional getForwardedIp(HttpClassicServerRequest request) { @@ -120,26 +93,22 @@ private static Optional getForwardedIp(HttpClassicServerRequest request) } private static Optional getProxyClientIp(HttpClassicServerRequest request) { - return getSingleIpFromHeader(request, "Proxy-Client-IP"); + return header(request, "Proxy-Client-IP").filter(HttpRequestUtils::knownIp); } private static Optional getWlProxyClientIp(HttpClassicServerRequest request) { - return getSingleIpFromHeader(request, "WL-Proxy-Client-IP"); + return header(request, "WL-Proxy-Client-IP").filter(HttpRequestUtils::knownIp); } private static Optional getHttpClientIp(HttpClassicServerRequest request) { - return getSingleIpFromHeader(request, "HTTP_CLIENT_IP"); + return header(request, "HTTP_CLIENT_IP").filter(HttpRequestUtils::knownIp); } private static Optional getHttpForwardedFor(HttpClassicServerRequest request) { - return getSingleIpFromHeader(request, "HTTP_X_FORWARDED_FOR"); - } - - private static Optional getSingleIpFromHeader(HttpClassicServerRequest request, String name) { - return header(request, name).map(StringUtils::trim).filter(HttpRequestUtils::knownIp); + return header(request, "HTTP_X_FORWARDED_FOR").filter(HttpRequestUtils::knownIp); } private static boolean knownIp(String ip) { - return StringUtils.isNotEmpty(ip) && !StringUtils.equalsIgnoreCase(ip, UNKNOWN_IP); + return !StringUtils.equalsIgnoreCase(ip, UNKNOWN_IP); } } diff --git a/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/UserContext.java b/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/UserContext.java index 9f62790db..28524dda8 100644 --- a/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/UserContext.java +++ b/common/services/authentication-service/src/main/java/modelengine/jade/authentication/context/UserContext.java @@ -16,19 +16,11 @@ public class UserContext { private String name; private String ip; private String language; - private String authToken; - private String csrfToken; public UserContext(String name, String ip, String language) { - this(name, ip, language, null, null); - } - - public UserContext(String name, String ip, String language, String authToken, String csrfToken) { this.name = name; this.ip = ip; this.language = language; - this.authToken = authToken; - this.csrfToken = csrfToken; } /** @@ -84,40 +76,4 @@ public void setLanguage(String language) { public String getLanguage() { return language; } - - /** - * 设置认证令牌。 - * - * @param authToken 表示认证令牌的 {@link String}。 - */ - public void setAuthToken(String authToken) { - this.authToken = authToken; - } - - /** - * 获取认证令牌。 - * - * @return 表示认证令牌的 {@link String}。 - */ - public String getAuthToken() { - return this.authToken; - } - - /** - * 设置 CSRF 令牌。 - * - * @param csrfToken 表示 CSRF 令牌的 {@link String}。 - */ - public void setCsrfToken(String csrfToken) { - this.csrfToken = csrfToken; - } - - /** - * 获取 CSRF 令牌。 - * - * @return 表示 CSRF 令牌的 {@link String}。 - */ - public String getCsrfToken() { - return this.csrfToken; - } } From baab88b7ba55b0f83d1aacf564db52ab1b7bd95e Mon Sep 17 00:00:00 2001 From: hhhhsc <1710496817@qq.com> Date: Wed, 26 Aug 2026 12:01:37 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../knowledge/external/DataMateKnowledgeBaseManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java index d31010a68..73b6e590c 100644 --- a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java +++ b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java @@ -148,10 +148,12 @@ private KnowledgeException handleException(HttpClientResponseException ex) { private void addUserHeader(HttpClassicClientRequest request) { UserContext context = UserContextHolder.get(); - if (context == null || StringUtils.isEmpty(context.getName())) { + String userName = context == null ? StringUtils.EMPTY : context.getName(); + log.info("DataMate request user: {}", StringUtils.isEmpty(userName) ? "" : userName); + if (StringUtils.isEmpty(userName)) { return; } - request.headers().set(USER_HEADER, context.getName()); + request.headers().set(USER_HEADER, userName); } private HttpClassicClient getHttpClient() { From 37b3c7c04a126fb5cab26d1db8093be1cad88318 Mon Sep 17 00:00:00 2001 From: hhhhsc <1710496817@qq.com> Date: Wed, 26 Aug 2026 15:29:34 +0800 Subject: [PATCH 5/5] =?UTF-8?q?retrieve=20=E5=9B=BA=E5=AE=9A=E7=94=A8?= =?UTF-8?q?=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../external/DataMateKnowledgeBaseManager.java | 11 ++++++++--- .../knowledge/DataMateKnowledgeBaseManagerTest.java | 6 +++--- .../MockedDataMateKnowledgeBaseInnerController.java | 11 ++++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java index 73b6e590c..1f287004f 100644 --- a/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java +++ b/app-builder/plugins/data-mate-knowledge/src/main/java/modelengine/fit/jade/datamate/knowledge/external/DataMateKnowledgeBaseManager.java @@ -55,6 +55,7 @@ public class DataMateKnowledgeBaseManager { private static final String BEARER = "Bearer "; private static final String CONTENT_TYPE_JSON = "application/json"; private static final String USER_HEADER = "User"; + private static final String RETRIEVE_USER = "admin"; /** 默认访问超时时间(秒)。 */ private static final int DEFAULT_TIMEOUT_SECONDS = 30; @@ -92,7 +93,7 @@ public DataMateKnowledgeListEntity listRepos(String apiKey, DataMateKnowledgeLis if (StringUtils.isNotEmpty(apiKey)) { request.headers().set(AUTHORIZATION, BEARER + apiKey); } - this.addUserHeader(request); + this.addCurrentUserHeader(request); try { Object object = this.httpClient.get().exchangeForEntity(request, Object.class); Map response = @@ -122,7 +123,7 @@ public DataMateRetrievalResult retrieve(String apiKey, DataMateRetrievalParam pa if (StringUtils.isNotEmpty(apiKey)) { request.headers().set(AUTHORIZATION, BEARER + apiKey); } - this.addUserHeader(request); + this.addUserHeader(request, RETRIEVE_USER); request.headers().set(CONTENT_TYPE, CONTENT_TYPE_JSON); try { Object object = this.httpClient.get().exchangeForEntity(request, Object.class); @@ -146,9 +147,13 @@ private KnowledgeException handleException(HttpClientResponseException ex) { return new KnowledgeException(retCode, ex, ex.getSimpleMessage()); } - private void addUserHeader(HttpClassicClientRequest request) { + private void addCurrentUserHeader(HttpClassicClientRequest request) { UserContext context = UserContextHolder.get(); String userName = context == null ? StringUtils.EMPTY : context.getName(); + this.addUserHeader(request, userName); + } + + private void addUserHeader(HttpClassicClientRequest request, String userName) { log.info("DataMate request user: {}", StringUtils.isEmpty(userName) ? "" : userName); if (StringUtils.isEmpty(userName)) { return; diff --git a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java index d39ded0b4..360c46550 100644 --- a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java +++ b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/DataMateKnowledgeBaseManagerTest.java @@ -126,9 +126,9 @@ public void shouldOkWhenRetrieve() { } @Test - @DisplayName("检索知识库时携带 User 请求头") - public void shouldAddUserHeaderWhenRetrieve() { - DataMateRetrievalParam param = DataMateRetrievalParam.builder().query("user").build(); + @DisplayName("检索知识库时固定携带 admin 用户") + public void shouldAddAdminUserHeaderWhenRetrieve() { + DataMateRetrievalParam param = DataMateRetrievalParam.builder().query("admin").build(); AtomicReference result = new AtomicReference<>(); UserContext context = new UserContext("test-user", "", ""); diff --git a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java index 208ceda20..01f6db844 100644 --- a/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java +++ b/app-builder/plugins/data-mate-knowledge/src/test/java/modelengine/fit/jade/datamate/knowledge/MockedDataMateKnowledgeBaseInnerController.java @@ -33,6 +33,7 @@ public class MockedDataMateKnowledgeBaseInnerController { private static final String USER_HEADER = "User"; private static final String EXPECTED_AUTHORIZATION = "Bearer 123"; private static final String EXPECTED_USER = "test-user"; + private static final String EXPECTED_RETRIEVE_USER = "admin"; private final ObjectSerializer serializer; @@ -46,7 +47,7 @@ public Map listRepos(HttpClassicServerRequest request, if ("error".equals(param.getName())) { throw new HttpClientException("error"); } - this.validateRequestContext(request, param.getName()); + this.validateRequestContext(request, "user".equals(param.getName()) ? EXPECTED_USER : null); String resourceName = "/listRepoResult.json"; String jsonContent = content(DataMateResponse.class, resourceName); return serializer.deserialize(jsonContent, Map.class); @@ -58,17 +59,17 @@ public Map retrieve(HttpClassicServerRequest request, if ("error".equals(param.getQuery())) { throw new HttpClientException("error"); } - this.validateRequestContext(request, param.getQuery()); + this.validateRequestContext(request, EXPECTED_RETRIEVE_USER); String resourceName = "/retrieveResult.json"; String jsonContent = content(DataMateResponse.class, resourceName); return serializer.deserialize(jsonContent, Map.class); } - private void validateRequestContext(HttpClassicServerRequest request, String testCase) { + private void validateRequestContext(HttpClassicServerRequest request, String expectedUser) { this.validate(EXPECTED_AUTHORIZATION.equals(request.headers().first(AUTHORIZATION).orElse(null)), "The authorization header is incorrect."); - if ("user".equals(testCase)) { - this.validate(EXPECTED_USER.equals(request.headers().first(USER_HEADER).orElse(null)), + if (expectedUser != null) { + this.validate(expectedUser.equals(request.headers().first(USER_HEADER).orElse(null)), "The User header is incorrect."); return; }