From 6f9728d15bd01de74a08d2c3ab6ab720f099f95b Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Mon, 9 Dec 2024 11:38:43 +0800 Subject: [PATCH] =?UTF-8?q?perf(X-Pack):=20=E6=9C=AC=E5=9C=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=99=BB=E5=BD=95=20MFA=20=E4=BA=8C=E6=AC=A1=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assets/authenticator_android.png | Bin 0 -> 5907 bytes .../src/assets/authenticator_iphone.png | Bin 0 -> 30381 bytes de-xpack | 2 +- .../api/permissions/login/api/LoginApi.java | 8 ++++++++ .../permissions/login/dto/MfaLoginDTO.java | 18 ++++++++++++++++++ .../api/permissions/login/vo/MfaQrVO.java | 16 ++++++++++++++++ .../java/io/dataease/auth/vo/MfaItem.java | 5 +++++ .../io/dataease/utils/WhitelistUtils.java | 2 ++ 8 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 core/core-frontend/src/assets/authenticator_android.png create mode 100644 core/core-frontend/src/assets/authenticator_iphone.png create mode 100644 sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/dto/MfaLoginDTO.java create mode 100644 sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/vo/MfaQrVO.java diff --git a/core/core-frontend/src/assets/authenticator_android.png b/core/core-frontend/src/assets/authenticator_android.png new file mode 100644 index 0000000000000000000000000000000000000000..9387e83ee2cd46d0053d4554102e8396fc0157f7 GIT binary patch literal 5907 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 literal 0 HcmV?d00001 diff --git a/de-xpack b/de-xpack index d3b0867dda..cac37fbedd 160000 --- a/de-xpack +++ b/de-xpack @@ -1 +1 @@ -Subproject commit d3b0867dda8112d038fc4aec5845391ffc2202eb +Subproject commit cac37fbedde6e095a2c0b52326336a969e102b24 diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/api/LoginApi.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/api/LoginApi.java index f1e99050f7..820add62e8 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/api/LoginApi.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/api/LoginApi.java @@ -3,7 +3,9 @@ package io.dataease.api.permissions.login.api; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.api.permissions.login.dto.MfaLoginDTO; import io.dataease.api.permissions.login.dto.PwdLoginDTO; +import io.dataease.api.permissions.login.vo.MfaQrVO; import io.dataease.auth.vo.TokenVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -45,4 +47,10 @@ public interface LoginApi { @GetMapping("/logout") void logout(); + @PostMapping("/mfa/qr/{id}") + MfaQrVO mfaQr(@PathVariable("id") Long id); + + @PostMapping("/mfa/login") + TokenVO mfaLogin(@RequestBody MfaLoginDTO dto); + } diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/dto/MfaLoginDTO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/dto/MfaLoginDTO.java new file mode 100644 index 0000000000..e636a75571 --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/dto/MfaLoginDTO.java @@ -0,0 +1,18 @@ +package io.dataease.api.permissions.login.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class MfaLoginDTO implements Serializable { + @Serial + private static final long serialVersionUID = -8218773323394184937L; + + private Long id; + + private String code; + + private String key; +} diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/vo/MfaQrVO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/vo/MfaQrVO.java new file mode 100644 index 0000000000..17733ea28a --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/login/vo/MfaQrVO.java @@ -0,0 +1,16 @@ +package io.dataease.api.permissions.login.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class MfaQrVO implements Serializable { + @Serial + private static final long serialVersionUID = -3465640829593927730L; + + private String img; + + private String key; +} diff --git a/sdk/common/src/main/java/io/dataease/auth/vo/MfaItem.java b/sdk/common/src/main/java/io/dataease/auth/vo/MfaItem.java index 80a1122bcb..b89687715e 100644 --- a/sdk/common/src/main/java/io/dataease/auth/vo/MfaItem.java +++ b/sdk/common/src/main/java/io/dataease/auth/vo/MfaItem.java @@ -1,5 +1,7 @@ package io.dataease.auth.vo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import java.io.Serial; @@ -13,4 +15,7 @@ public class MfaItem implements Serializable { private boolean enabled; private boolean ready; + + @JsonSerialize(using= ToStringSerializer.class) + private Long uid; } diff --git a/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java b/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java index 2dd9125645..e7ed3196dd 100644 --- a/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java +++ b/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java @@ -78,6 +78,8 @@ public class WhitelistUtils { || StringUtils.startsWithAny(requestURI, "/websocket") || StringUtils.startsWithAny(requestURI, "/map/") || StringUtils.startsWithAny(requestURI, "/oauth2/") + || StringUtils.startsWithAny(requestURI, "/mfa/qr/") + || StringUtils.startsWithAny(requestURI, "/mfa/login") || StringUtils.startsWithAny(requestURI, "/typeface/download") || StringUtils.startsWithAny(requestURI, "/typeface/defaultFont") || StringUtils.startsWithAny(requestURI, "/typeface/listFont")