From e49938ca1eaa6d8a00e8ce86f5f8c8ea264bc133 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 --- .../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 + .../settings/XpackAuthenticationApi.java | 4 ++ .../api/xpack/settings/XpackSaml2Api.java | 12 +++-- .../api/xpack/settings/vo/XpackSaml2VO.java | 13 +++-- sdk/common/pom.xml | 52 +++++++++---------- .../result/ResultResponseBodyAdvice.java | 5 ++ 9 files changed, 59 insertions(+), 34 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 97bdf019e2..62d05afe52 100644 --- a/core/core-frontend/src/locales/en.ts +++ b/core/core-frontend/src/locales/en.ts @@ -627,6 +627,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 295599a859..245ae3471a 100644 --- a/core/core-frontend/src/locales/tw.ts +++ b/core/core-frontend/src/locales/tw.ts @@ -607,6 +607,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 4ddc1ce5a6..af8287c579 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -610,6 +610,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 c8f2ae55e0..72b03a9282 100644 --- a/sdk/common/pom.xml +++ b/sdk/common/pom.xml @@ -11,18 +11,14 @@ common - + + 3.4.6 + org.springframework.boot spring-boot-starter - - - javax.annotation - javax.annotation-api - - @@ -34,23 +30,7 @@ org.springframework.boot spring-boot-starter-validation - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.querydsl - querydsl-jpa - ${querydsl.version} - jakarta - - - com.querydsl - querydsl-apt - jakarta - ${querydsl.version} - provided - + org.apache.commons commons-lang3 @@ -61,10 +41,22 @@ knife4j-openapi3-jakarta-spring-boot-starter + + com.baomidou + mybatis-plus-boot-starter + + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus.version} + + org.apache.velocity velocity-engine-core + org.apache.httpcomponents httpcore @@ -147,11 +139,17 @@ - io.dataease - extensions-sync - ${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) {