From c0ce1ca428087aba303421d65b185ffeafaaf22d Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Sun, 28 Sep 2025 16:46:20 +0800 Subject: [PATCH] =?UTF-8?q?perf(X-Pack):=20=E5=AE=8C=E5=96=84=20SAML2=20?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E7=AD=BE=E5=90=8D=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assets/svg/icon_file_pem_colorfull.svg | 1 + core/core-frontend/src/locales/en.ts | 2 ++ core/core-frontend/src/locales/tw.ts | 2 ++ core/core-frontend/src/locales/zh-CN.ts | 2 ++ .../xpack/settings/XpackAuthenticationApi.java | 4 ++++ .../api/xpack/settings/XpackSaml2Api.java | 12 ++++++++---- .../api/xpack/settings/vo/XpackSaml2VO.java | 13 ++++++++++--- sdk/common/pom.xml | 16 +++++++++++++++- .../result/ResultResponseBodyAdvice.java | 5 +++++ 9 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 core/core-frontend/src/assets/svg/icon_file_pem_colorfull.svg diff --git a/core/core-frontend/src/assets/svg/icon_file_pem_colorfull.svg b/core/core-frontend/src/assets/svg/icon_file_pem_colorfull.svg new file mode 100644 index 0000000000..2cdd8f50bb --- /dev/null +++ b/core/core-frontend/src/assets/svg/icon_file_pem_colorfull.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core/core-frontend/src/locales/en.ts b/core/core-frontend/src/locales/en.ts index dc71cffbba..5bdd7aa906 100644 --- a/core/core-frontend/src/locales/en.ts +++ b/core/core-frontend/src/locales/en.ts @@ -620,6 +620,8 @@ export default { field_mapping: 'Field Mapping', oauth2name: 'For example: {\'{\'}"account": "oauth2Account", "name": "oauth2Name", "email": "email"{\'}\'}', + saml2name: + 'For example: {\'{\'}"account": "saml2Account", "name": "saml2Name", "email": "email"{\'}\'}', oidc_settings: 'OIDC Settings', test_mail_recipient: 'Only used as a test email recipient', to_enable_ssl: 'If the SMTP port is 465, you usually need to enable SSL', diff --git a/core/core-frontend/src/locales/tw.ts b/core/core-frontend/src/locales/tw.ts index af300906df..47465d8282 100644 --- a/core/core-frontend/src/locales/tw.ts +++ b/core/core-frontend/src/locales/tw.ts @@ -600,6 +600,8 @@ export default { field_mapping: '字段映射', oauth2name: '例如:{\'{\'}"account": "oauth2Account", "name": "oauth2Name", "email": "email"{\'}\'}', + saml2name: + '例如:{\'{\'}"account": "saml2Account", "name": "saml2Name", "email": "email"{\'}\'}', oidc_settings: 'OIDC設定', test_mail_recipient: '僅用來作為測試郵件收件者', to_enable_ssl: '如果SMTP連接埠是465 ,通常需要啟用SSL', diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index 46199bc13b..62e3180752 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -603,6 +603,8 @@ export default { field_mapping: '字段映射', oauth2name: '例如:{\'{\'}"account": "oauth2Account", "name": "oauth2Name", "email": "email"{\'}\'}', + saml2name: + '例如:{\'{\'}"account": "saml2Account", "name": "saml2Name", "email": "email"{\'}\'}', oidc_settings: 'OIDC设置', test_mail_recipient: '仅用来作为测试邮件收件人', to_enable_ssl: '如果SMTP端口是 465 ,通常需要启用SSL', diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/XpackAuthenticationApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/XpackAuthenticationApi.java index c859a1f684..a92c4d9b19 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/XpackAuthenticationApi.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/XpackAuthenticationApi.java @@ -81,6 +81,10 @@ public interface XpackAuthenticationApi { @PostMapping("/validate/oauth2") String validateOauth2(@RequestBody XpackOauth2VO editor); + @Operation(summary = "验证SAML2") + @PostMapping("/validate/saml2") + String validateSaml2(@RequestBody XpackSaml2VO editor); + @Operation(summary = "验证") @PostMapping("/validateId/{id}") String validate(@PathVariable("id") Long id); diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/XpackSaml2Api.java b/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/XpackSaml2Api.java index df422d593d..1ee34a1b16 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/XpackSaml2Api.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/XpackSaml2Api.java @@ -2,6 +2,7 @@ package io.dataease.api.xpack.settings; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -9,9 +10,12 @@ import org.springframework.web.bind.annotation.PostMapping; @ApiSupport(order = 899) public interface XpackSaml2Api { - @GetMapping("/login") - void saml2Login(); - @PostMapping("/sso") - void saml2Callback() throws Exception; + String sso(); + + @GetMapping(value = "/metadata", produces = MediaType.APPLICATION_XML_VALUE) + String metadata(); + + @GetMapping("/login") + void login(); } diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/vo/XpackSaml2VO.java b/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/vo/XpackSaml2VO.java index ae20026c3f..e06fa1718c 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/vo/XpackSaml2VO.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/xpack/settings/vo/XpackSaml2VO.java @@ -2,14 +2,16 @@ package io.dataease.api.xpack.settings.vo; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; +import org.opensaml.security.x509.BasicX509Credential; +import org.opensaml.xmlsec.signature.X509Certificate; import java.io.Serializable; import java.security.PrivateKey; -import java.security.cert.X509Certificate; @Data public class XpackSaml2VO implements Serializable { + private String idpMetaUrl; private String spEntityId; private String spAcs; @@ -17,15 +19,20 @@ public class XpackSaml2VO implements Serializable { private String idpEntityId; private String idpLogoutUrl; + private String privateKey; + private String certificate; + + private String mapping; + @JsonIgnore private PrivateKey spPrivateKey; @JsonIgnore - private X509Certificate spCertificate; + private BasicX509Credential spCertificate; @JsonIgnore private X509Certificate idpCertificate; - private int assertionValidityTime = 300; // 5分钟 + private int assertionValidityTime = 300; private boolean wantAssertionsSigned = true; private boolean wantAuthnRequestsSigned = true; diff --git a/sdk/common/pom.xml b/sdk/common/pom.xml index 92d6c9f8dd..72b03a9282 100644 --- a/sdk/common/pom.xml +++ b/sdk/common/pom.xml @@ -11,7 +11,9 @@ common - + + 3.4.6 + @@ -136,6 +138,18 @@ ${project.version} + + org.opensaml + opensaml-core + ${opensaml.version} + + + + + org.opensaml + opensaml-saml-impl + ${opensaml.version} + diff --git a/sdk/common/src/main/java/io/dataease/result/ResultResponseBodyAdvice.java b/sdk/common/src/main/java/io/dataease/result/ResultResponseBodyAdvice.java index ef2dc5a03c..da9aa40737 100644 --- a/sdk/common/src/main/java/io/dataease/result/ResultResponseBodyAdvice.java +++ b/sdk/common/src/main/java/io/dataease/result/ResultResponseBodyAdvice.java @@ -3,6 +3,7 @@ package io.dataease.result; import io.dataease.i18n.I18n; import io.dataease.i18n.Translator; import io.dataease.utils.JsonUtil; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; @@ -32,6 +33,10 @@ public class ResultResponseBodyAdvice implements ResponseBodyAdvice { o = translate(o); } + if (ObjectUtils.isNotEmpty(mediaType) && MediaType.APPLICATION_XML_VALUE.equals(mediaType.toString())) { + return o; + } + if (!(o instanceof ResultMessage)) { ResultMessage resultMessage = ResultMessage.success(o); if (o instanceof String) {