From c9260c49660137967a8f44485979829b9b0be38b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 7 Feb 2022 15:13:15 +0000 Subject: [PATCH 01/15] update README.md. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 353e087fc..896d6c3ac 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +# 此分支进入维护阶段 +> 不进行更新 只修复bug 持续维护到2022年10月
+> 推荐使用 4.X 版本
+> 主分支与Sa-Token分支合并 + ## 平台简介 [![码云Gitee](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![GitHub](https://img.shields.io/github/stars/JavaLionLi/RuoYi-Vue-Plus.svg?style=social&label=Stars)](https://github.com/JavaLionLi/RuoYi-Vue-Plus) From 82e8ab2385b8d0b5c4f11cbdcee42178896fe61f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Fri, 18 Feb 2022 10:39:53 +0800 Subject: [PATCH 02/15] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 896d6c3ac..353e087fc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,3 @@ -# 此分支进入维护阶段 -> 不进行更新 只修复bug 持续维护到2022年10月
-> 推荐使用 4.X 版本
-> 主分支与Sa-Token分支合并 - ## 平台简介 [![码云Gitee](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![GitHub](https://img.shields.io/github/stars/JavaLionLi/RuoYi-Vue-Plus.svg?style=social&label=Stars)](https://github.com/JavaLionLi/RuoYi-Vue-Plus) From f3a4104fd061a8895fa5c44e6d9260b718d6311a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Fri, 18 Feb 2022 14:05:32 +0800 Subject: [PATCH 03/15] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20minio=20?= =?UTF-8?q?=E9=80=82=E9=85=8D=20https=20=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/oss/service/impl/MinioOssStrategy.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioOssStrategy.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioOssStrategy.java index eb2e77042..93f88fb3a 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioOssStrategy.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioOssStrategy.java @@ -9,6 +9,8 @@ import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.properties.OssProperties; import com.ruoyi.oss.service.abstractd.AbstractOssStrategy; import io.minio.*; +import io.minio.http.HttpUtils; +import okhttp3.HttpUrl; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; @@ -29,10 +31,15 @@ public class MinioOssStrategy extends AbstractOssStrategy { public void init(OssProperties ossProperties) { super.init(ossProperties); try { - minioClient = MinioClient.builder() - .endpoint(properties.getEndpoint(), 443, OssConstant.IS_HTTPS.equals(ossProperties.getIsHttps())) - .credentials(properties.getAccessKey(), properties.getSecretKey()) - .build(); + MinioClient.Builder builder = MinioClient.builder(); + if (OssConstant.IS_HTTPS.equals(ossProperties.getIsHttps())) { + HttpUrl url = HttpUtils.getBaseUrl(properties.getEndpoint()) + .newBuilder().scheme("https").build(); + builder.endpoint(url); + } else { + builder.endpoint(properties.getEndpoint()); + } + minioClient = builder.credentials(properties.getAccessKey(), properties.getSecretKey()).build(); createBucket(); } catch (Exception e) { throw new OssException("Minio存储配置错误! 请检查系统配置:[" + e.getMessage() + "]"); From 329c070e058b05e014c4f2d226098949e6df0a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 18 Feb 2022 16:20:58 +0000 Subject: [PATCH 04/15] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20=E5=A4=9A?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=A4=9A=E8=AE=BE=E5=A4=87=E7=9A=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/common/helper/LoginHelper.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java index a15220859..cd0d25cfd 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java @@ -12,7 +12,13 @@ import lombok.NoArgsConstructor; /** * 登录鉴权助手 - * 为适配多端登录而封装 + * + * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app + * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios + * 可以组成 用户类型与设备类型多对多的 权限灵活控制 + * + * 多用户体系 针对 多种用户类型 但权限控制不一致 + * 可以组成 多用户类型表与多设备类型 分别控制权限 * * @author Lion Li */ @@ -26,7 +32,6 @@ public class LoginHelper { /** * 登录系统 - * 针对两套用户体系 * * @param loginUser 登录用户信息 */ @@ -38,7 +43,7 @@ public class LoginHelper { /** * 登录系统 基于 设备类型 - * 针对一套用户体系 + * 针对相同用户体系不同设备 * * @param loginUser 登录用户信息 */ From 95a2c74462a6d8b607bc3a060149be4b420262ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Thu, 3 Mar 2022 14:34:13 +0800 Subject: [PATCH 05/15] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90=20=E4=BB=8E=20aop=20=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=88=B0=20=E6=8B=A6=E6=88=AA=E5=99=A8=20=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E8=8E=B7=E5=8F=96=E4=BB=A3=E7=90=86=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/system/service/impl/SysDeptServiceImpl.java | 3 +-- .../com/ruoyi/system/service/impl/SysRoleServiceImpl.java | 5 ++--- .../com/ruoyi/system/service/impl/SysUserServiceImpl.java | 3 +-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 5cd3fe0e6..6b13f0b19 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -14,7 +14,6 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.TreeBuildUtils; -import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysRoleMapper; import com.ruoyi.system.mapper.SysUserMapper; @@ -155,7 +154,7 @@ public class SysDeptServiceImpl implements ISysDeptService { if (!LoginHelper.isAdmin()) { SysDept dept = new SysDept(); dept.setDeptId(deptId); - List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); + List depts = this.selectDeptList(dept); if (CollUtil.isEmpty(depts)) { throw new ServiceException("没有权限访问部门数据!"); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index 81334892f..19f3211f5 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -10,7 +10,6 @@ import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.LoginHelper; -import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysRoleDept; import com.ruoyi.system.domain.SysRoleMenu; import com.ruoyi.system.domain.SysUserRole; @@ -102,7 +101,7 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public List selectRoleAll() { - return SpringUtils.getAopProxy(this).selectRoleList(new SysRole()); + return this.selectRoleList(new SysRole()); } /** @@ -183,7 +182,7 @@ public class SysRoleServiceImpl implements ISysRoleService { if (!LoginHelper.isAdmin()) { SysRole role = new SysRole(); role.setRoleId(roleId); - List roles = SpringUtils.getAopProxy(this).selectRoleList(role); + List roles = this.selectRoleList(role); if (CollUtil.isEmpty(roles)) { throw new ServiceException("没有权限访问角色数据!"); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index c3ff6f409..6ec437b97 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -13,7 +13,6 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysUserPost; import com.ruoyi.system.domain.SysUserRole; @@ -209,7 +208,7 @@ public class SysUserServiceImpl implements ISysUserService { if (!LoginHelper.isAdmin()) { SysUser user = new SysUser(); user.setUserId(userId); - List users = SpringUtils.getAopProxy(this).selectUserList(user); + List users = this.selectUserList(user); if (CollUtil.isEmpty(users)) { throw new ServiceException("没有权限访问用户数据!"); } From bf362b9aba9335aa776e51037ecb6a10ed18efb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Tue, 28 Jun 2022 13:15:20 +0800 Subject: [PATCH 06/15] =?UTF-8?q?update=20=E6=9B=B4=E6=94=B9=20readme=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b7f5d60b0..d2e514751 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-4.2.0_beta1-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-4.2.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.6-blue.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() From 23cbed3aac9fb85c4b810f1a1603678b285debdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Wed, 29 Jun 2022 15:25:40 +0800 Subject: [PATCH 07/15] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=9B=B4?= =?UTF-8?q?=E6=AD=A3=E9=94=99=E8=AF=AF=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/docker/nginx/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/script/docker/nginx/nginx.conf b/script/docker/nginx/nginx.conf index daa2acf49..014b10e7d 100644 --- a/script/docker/nginx/nginx.conf +++ b/script/docker/nginx/nginx.conf @@ -23,16 +23,16 @@ http { upstream server { ip_hash; - server 127.0.0.1:8080; - server 127.0.0.1:8080; + server 172.31.0.60:8080; + server 172.31.0.61:8080; } upstream monitor-admin { - server 127.0.0.1:9090; + server 172.31.0.90:9090; } upstream xxljob-admin { - server 127.0.0.1:9100; + server 172.31.0.92:9100; } server { From b2a927cc5ee9a1676b8fb953e779b202d459bfd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Wed, 29 Jun 2022 15:28:24 +0800 Subject: [PATCH 08/15] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=9B=B4?= =?UTF-8?q?=E6=AD=A3=E9=94=99=E8=AF=AF=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/docker/nginx/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/script/docker/nginx/nginx.conf b/script/docker/nginx/nginx.conf index 014b10e7d..ecf71955f 100644 --- a/script/docker/nginx/nginx.conf +++ b/script/docker/nginx/nginx.conf @@ -23,16 +23,16 @@ http { upstream server { ip_hash; - server 172.31.0.60:8080; - server 172.31.0.61:8080; + server 172.30.0.60:8080; + server 172.30.0.61:8080; } upstream monitor-admin { - server 172.31.0.90:9090; + server 172.30.0.90:9090; } upstream xxljob-admin { - server 172.31.0.92:9100; + server 172.30.0.92:9100; } server { From 5c9fe22780306f4bf68e1f4a35e079745a00ea6c Mon Sep 17 00:00:00 2001 From: JaneYork Date: Mon, 18 Jul 2022 03:46:13 +0000 Subject: [PATCH 09/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9AOSS=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=9F=9F=E5=90=8D=E6=8B=BC=E6=8E=A5=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E6=97=A0=E9=9C=80=E9=85=8D=E7=BD=AEHTTP?= =?UTF-8?q?=E7=AD=89=E5=89=8D=E7=BC=80=20=E4=BF=AE=E5=A4=8D=EF=BC=9AOSS?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E5=9F=9F=E5=90=8D=E6=8B=BC=E6=8E=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E6=97=A0=E9=9C=80=E9=85=8D=E7=BD=AE?= =?UTF-8?q?HTTP=E3=80=81HTTPS=E7=AD=89=E5=89=8D=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java index 6f6be8f8c..4f1c7ca88 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java @@ -119,12 +119,12 @@ public class OssClient { } public String getUrl() { + String header = OssConstant.IS_HTTPS.equals(properties.getIsHttps()) ? "https://" : "http://"; String domain = properties.getDomain(); if (StringUtils.isNotBlank(domain)) { - return domain; + return header + domain; } String endpoint = properties.getEndpoint(); - String header = OssConstant.IS_HTTPS.equals(properties.getIsHttps()) ? "https://" : "http://"; // 云服务商直接返回 if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)){ return header + properties.getBucketName() + "." + endpoint; From 6f83ed328540a32ec300750ba5a5e56d1d1a4d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Mon, 18 Jul 2022 11:55:52 +0800 Subject: [PATCH 10/15] =?UTF-8?q?reset=20=E5=9B=9E=E6=BB=9A=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java index 4f1c7ca88..6f6be8f8c 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java @@ -119,12 +119,12 @@ public class OssClient { } public String getUrl() { - String header = OssConstant.IS_HTTPS.equals(properties.getIsHttps()) ? "https://" : "http://"; String domain = properties.getDomain(); if (StringUtils.isNotBlank(domain)) { - return header + domain; + return domain; } String endpoint = properties.getEndpoint(); + String header = OssConstant.IS_HTTPS.equals(properties.getIsHttps()) ? "https://" : "http://"; // 云服务商直接返回 if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)){ return header + properties.getBucketName() + "." + endpoint; From 138842e9ba140431d902dfbeee42ae0877a68c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Mon, 8 Aug 2022 18:20:29 +0800 Subject: [PATCH 11/15] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=99=BB=E5=BD=95=E4=B8=8E=E7=9F=AD=E4=BF=A1=E7=99=BB?= =?UTF-8?q?=E5=BD=95=20=E5=9B=BD=E9=99=85=E5=8C=96=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/i18n/messages.properties | 2 +- ruoyi-admin/src/main/resources/i18n/messages_en_US.properties | 2 +- ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties | 2 +- .../main/java/com/ruoyi/system/service/SysLoginService.java | 4 +--- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index 7ddd6cd92..1645af347 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -41,5 +41,5 @@ repeat.submit.message=\u4E0D\u5141\u8BB8\u91CD\u590D\u63D0\u4EA4\uFF0C\u8BF7\u7A rate.limiter.message=\u8BBF\u95EE\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 sms.code.not.blank=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A sms.code.retry.limit.count=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u9519\u8BEF\u6B21\u6570\u8FC7\u591A\uFF0C\u5E10\u6237\u9501\u5B9A{0}\u5206\u949F +sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{0}\u5206\u949F xcx.code.not.blank=\u5C0F\u7A0B\u5E8Fcode\u4E0D\u80FD\u4E3A\u7A7A diff --git a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties index 7aae8ced3..92d8185d3 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties @@ -41,5 +41,5 @@ repeat.submit.message=Repeat submit is not allowed, please try again later rate.limiter.message=Visit too frequently, please try again later sms.code.not.blank=Sms code cannot be blank sms.code.retry.limit.count=Sms code input error {0} times -sms.code.retry.limit.exceed=Too many sms code errors, account locked for {0} minutes +sms.code.retry.limit.exceed=Sms code input error {0} times, account locked for {0} minutes xcx.code.not.blank=Mini program code cannot be blank diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties index 7ddd6cd92..1645af347 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -41,5 +41,5 @@ repeat.submit.message=\u4E0D\u5141\u8BB8\u91CD\u590D\u63D0\u4EA4\uFF0C\u8BF7\u7A rate.limiter.message=\u8BBF\u95EE\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 sms.code.not.blank=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A sms.code.retry.limit.count=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u9519\u8BEF\u6B21\u6570\u8FC7\u591A\uFF0C\u5E10\u6237\u9501\u5B9A{0}\u5206\u949F +sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{0}\u5206\u949F xcx.code.not.blank=\u5C0F\u7A0B\u5E8Fcode\u4E0D\u80FD\u4E3A\u7A7A diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java index bf5413172..ea53635e7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java @@ -15,9 +15,7 @@ import com.ruoyi.common.core.service.LogininforService; import com.ruoyi.common.enums.DeviceType; import com.ruoyi.common.enums.LoginType; import com.ruoyi.common.enums.UserStatus; -import com.ruoyi.common.exception.user.CaptchaException; -import com.ruoyi.common.exception.user.CaptchaExpireException; -import com.ruoyi.common.exception.user.UserException; +import com.ruoyi.common.exception.user.*; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.MessageUtils; From 4e807455e062c1d4574e91c231278497e953cb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=95=E6=A2=A6=E8=AE=B0?= <545073804@qq.com> Date: Tue, 13 Sep 2022 08:19:19 +0000 Subject: [PATCH 12/15] =?UTF-8?q?update=20=E7=BC=A9=E8=BF=9B=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6.editorconfig=E6=B7=BB=E5=8A=A0.yaml?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=A0=BC=E5=BC=8F=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 枕梦记 <545073804@qq.com> --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 672defc11..25b312ef3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,7 +10,7 @@ end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true -[*.{json,yml}] +[*.{json,yml,yaml}] indent_size = 2 [*.md] From e4fff795b8cbe180708c8b8fcae5b495f3833055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 13 Sep 2022 08:20:54 +0000 Subject: [PATCH 13/15] =?UTF-8?q?=E5=9B=9E=E9=80=80=20'Pull=20Request=20!2?= =?UTF-8?q?30=20:=20=E3=80=90=E8=BD=BB=E9=87=8F=E7=BA=A7=20PR=E3=80=91?= =?UTF-8?q?=EF=BC=9Aupdate=20=E7=BC=A9=E8=BF=9B=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6.editorconfig=E6=B7=BB=E5=8A=A0.yaml=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E6=94=AF=E6=8C=81'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 25b312ef3..672defc11 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,7 +10,7 @@ end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true -[*.{json,yml,yaml}] +[*.{json,yml}] indent_size = 2 [*.md] From 1496220a74b8193295eb1fab5c324156d959727e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Wed, 28 Dec 2022 18:53:29 +0800 Subject: [PATCH 14/15] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=9B=B4?= =?UTF-8?q?=E7=BB=86=E8=87=B4=E7=9A=84=20issue=20=E6=8F=90=E9=97=AE?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE.zh-CN.md | 38 ++++++++++++++++++++++++++- .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md | 2 +- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/.gitee/ISSUE_TEMPLATE.zh-CN.md b/.gitee/ISSUE_TEMPLATE.zh-CN.md index b6fcbea86..cf82237f3 100644 --- a/.gitee/ISSUE_TEMPLATE.zh-CN.md +++ b/.gitee/ISSUE_TEMPLATE.zh-CN.md @@ -1,13 +1,49 @@ ### 使用版本(未按照模板填写直接删除) +- jdk版本(带上尾号): 例如 1.8.0_202 +- 框架版本(项目启动时输出的版本号): 例如 4.4.0 +- 其他依赖版本(你觉得有必要的): + +### 问题前提 + +> 功能不好用 不会用 是否已经看过项目文档 +> 项目运行报错 是否已经拿着报错信息去百度 常见报错百度百度足以 +> 是否搜索过其他issue 一些已经解决的问题 会在issue内留下解决方法 +> 无法线上解决或者与框架无关的问题的欢迎加VIP群跟作者一对一谈 + +### 异常模块 + +> 此报错都涉及到那些系统模块 + +例如 ruoyi-system ruoyi-auth 等等 ### 问题描述 +> 越详细越容易直击问题所在 + +已知: XXX功能不好用 或 XXX数据不正常 等等 ### 希望结果 +> 想知道你觉得怎么样是正常或者合理的 + +希望功能可以有XXX结果 或者 XXX现象 ### 重现步骤 +> 作者并不知道这个问题是如何出现的 -### 报错信息(截图为主 请勿发混乱格式) \ No newline at end of file +- 1 +- 2 +- 3 + +### 相关代码与报错信息(请勿发混乱格式) + +> 代码可按照如下形式提供或者截图均可 越详细越好 +> 大多数问题都是 代码编写错误问题 逻辑问题 或者用法错误等问题 + +```java +public class XXX { + +} +``` \ No newline at end of file diff --git a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md index f5ef7c154..ef11b85b0 100644 --- a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md +++ b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md @@ -1,7 +1,7 @@ ### 更改目的 解决了什么问题(请提交到dev分支) -### 描述 做了哪些改动 +### 改动逻辑 这么写的思路(让作者更好的理解你的意图) ### 测试 都做了哪些测试(未经过测试不采纳) \ No newline at end of file From ecb6fcc2c5060870633af48a8ef87aff336c73ca Mon Sep 17 00:00:00 2001 From: mayuanfei Date: Sat, 7 Jan 2023 22:23:37 +0800 Subject: [PATCH 15/15] =?UTF-8?q?=E6=89=A9=E5=B1=95MP=E7=9A=84TypeHandler?= =?UTF-8?q?=EF=BC=8C=E4=BD=BFdao=E5=B1=82=E5=AE=9E=E7=8E=B0=E5=AF=B9?= =?UTF-8?q?=E8=A1=A8=E5=AD=97=E6=AE=B5=E7=9A=84=E5=8A=A0=E8=A7=A3=E5=AF=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++ .../src/main/resources/application.yml | 25 +++- .../com/ruoyi/common/enums/AlgorithmType.java | 35 +++++ ruoyi-demo/pom.xml | 5 + .../TestEncryptFieldController.java | 125 ++++++++++++++++++ .../java/com/ruoyi/demo/domain/TestDemo.java | 5 +- ruoyi-framework/pom.xml | 5 + .../properties/EncryptFieldProperties.java | 46 +++++++ .../framework/handler/EncryptTypeHandler.java | 48 +++++++ .../framework/manager/EncryptorManager.java | 66 +++++++++ .../manager/encryptor/AesEncryptor.java | 72 ++++++++++ .../manager/encryptor/Base64Encryptor.java | 54 ++++++++ .../manager/encryptor/IEncryptor.java | 42 ++++++ .../manager/encryptor/RsaEncryptor.java | 62 +++++++++ .../manager/encryptor/Sm2Encryptor.java | 62 +++++++++ .../manager/encryptor/Sm4Encryptor.java | 60 +++++++++ 16 files changed, 718 insertions(+), 2 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/AlgorithmType.java create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestEncryptFieldController.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/EncryptFieldProperties.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/handler/EncryptTypeHandler.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/EncryptorManager.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/AesEncryptor.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Base64Encryptor.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/IEncryptor.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/RsaEncryptor.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Sm2Encryptor.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Sm4Encryptor.java diff --git a/pom.xml b/pom.xml index 3de969cfd..a5450f8a1 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ 2.14.2 2.3.1 1.18.24 + 1.72 31.1-jre @@ -235,6 +236,13 @@ ${snakeyaml.version} + + + org.bouncycastle + bcprov-jdk15to18 + ${bouncycastle.version} + + com.ruoyi diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 80f3bf35e..17c131a41 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -176,7 +176,30 @@ mybatis-plus: updateStrategy: NOT_NULL # 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件 where-strategy: NOT_NULL - + # 扫描自定义TypeHandler + type-handlers-package: com.ruoyi.framework.handler + encrypt-field: + # 字段加密算法,可自定义算法。目前支持:base64、aes、rsa、sm2、sm4。 + # 其中base64不需要公钥私钥;ras、sm2需要公私钥信息; + # aes采用AES/CBC/PKCS5Padding,需要secretKey和ivKey; + # sm4采用SM4/ECB/PKCS5Padding,需要secretKey + # encodeType可以指定最终保存的编码格式。可以是hex或base64格式。默认base64 +# algorithm: base64 +# algorithm: rsa +# publicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCDt41GIcWvY6/tpjOLoWY78Oy00uWcNbMRG/8DRoS79/h2D+pV8uxV+0ezaN+fBFCZnK8TdJcPeU4EnNRUh/8HEY33KFvZ700n+Gj5BHUUDKzx3UVFNuF49UI/yoJ8rz6VQQHO79KK89VwmSMO77Tfee1ofe0STY6IwMt/MwaoKwIDAQAB +# privateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIO3jUYhxa9jr+2mM4uhZjvw7LTS5Zw1sxEb/wNGhLv3+HYP6lXy7FX7R7No358EUJmcrxN0lw95TgSc1FSH/wcRjfcoW9nvTSf4aPkEdRQMrPHdRUU24Xj1Qj/KgnyvPpVBAc7v0orz1XCZIw7vtN957Wh97RJNjojAy38zBqgrAgMBAAECgYAkXx4qvI6rFNryw88+Am6JpMioUghHb2ioE9QCYomqohnA+DocS71JLN8qwo3lijp7gJGzzKEeC8Aoc+oKAZfBQQwPP0K/ql+NcLdlqNAr+XyzkZrLJD/BfluQ6mXI23tjonWnPPZ1Et9HC3zXRQPiuh7Ff6UoqatTMI3OIbSyuQJBAPbaJpVYmIsWJdpvaAC6hcGgR/vbG9yX8VphPn8/2wsm2MmQrRkUoKkudE/veX3KQjGikDwo9+bT6aBl+nn2DUUCQQCImSGZFNcGqhMLyRGVogP6fh0YZSEQAhFbZ69nQmplqbie+dREhODH5Vs5F0C2aL5iSR/UaIDkNEA1auX7x56vAkAFWjON927PTTqi4tmBconl6eDFsDmJbe34xLUDM1I/iqcWr8FhEtZs9Knm9c1PkewfgWPZOhYt9hhRtwRYUqJ1AkAPvQ0I9US9KNVe80DKa8tnjiZODEDd9k8HqA+mpxlZM0/pSUGyz1iSz5NOJaa4HaNp8aDwOUY4hOis/u8Wrm5TAkEA00YeUsaXlMyMF/5pjols44tXb54AjAC2mH66pz9JsKg7pKpWVOpEV5rMY58CGZHWau69vGLZnCd1coeMw77YAQ== +# encodeType: base64 +# algorithm: sm2 +# publicKey: MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAESU5V56NTde1KYcp63wHEXxUyh2kwEVgVNhlQiqUQMbJJWyIDny7CW2lt71XGmm8sjmSkbGZYMcrM27H2wzp0Gw== +# privateKey: MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgM6U/o1oR8swRomlNffyqE2tglhuUcWtPEFYrCsvGUa2gCgYIKoEcz1UBgi2hRANCAARJTlXno1N17UphynrfAcRfFTKHaTARWBU2GVCKpRAxsklbIgOfLsJbaW3vVcaabyyOZKRsZlgxyszbsfbDOnQb +# encodeType: hex +# algorithm: aes +# secretKey: "A84DC2F738843E1A4170F053F5025F9A74164FFC158CB245570728CF00731803" +# ivKey: "00000000000000000000000000000000" +# encodeType: hex + algorithm: sm4 + secretKey: 6fyk4jdi5yrlrdcv + encodeType: base64 # Swagger配置 swagger: # 是否开启swagger diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AlgorithmType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AlgorithmType.java new file mode 100644 index 000000000..8aaf7f465 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AlgorithmType.java @@ -0,0 +1,35 @@ +package com.ruoyi.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 算法名称 + * @author 老马 + */ +@Getter +@AllArgsConstructor +public enum AlgorithmType { + /** + * base64 + */ + BASE64("base64"), + /** + * aes + */ + AES("aes"), + /** + * rsa + */ + RSA("rsa"), + /** + * sm2 + */ + SM2("sm2"), + /** + * sm4 + */ + SM4("sm4"); + + private final String algorithm; +} diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml index 46b45981d..352ef9d27 100644 --- a/ruoyi-demo/pom.xml +++ b/ruoyi-demo/pom.xml @@ -23,6 +23,11 @@ ruoyi-common + + com.ruoyi + ruoyi-framework + + com.ruoyi ruoyi-sms diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestEncryptFieldController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestEncryptFieldController.java new file mode 100644 index 000000000..58d59bc93 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestEncryptFieldController.java @@ -0,0 +1,125 @@ +package com.ruoyi.demo.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.demo.domain.TestDemo; +import com.ruoyi.demo.mapper.TestDemoMapper; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * 测试数据库字段加解密 + * + * @author 老马 + * @date 2023-01-06 14:48 + */ +@SaIgnore +@RestController +@RequestMapping("/demo/encrypt") +public class TestEncryptFieldController { + + @Resource + private TestDemoMapper demoMapper; + + /** + * 配置内容 + * encrypt-field: + algorithm: base64 + */ + @GetMapping("/base64") + public R base64() { + //插入 + TestDemo testDemo = new TestDemo(); + testDemo.setTestKey("testkey"); + testDemo.setValue("testvalue"); + demoMapper.insert(testDemo); + //查询 + TestDemo testDemo1 = this.demoMapper.selectById(testDemo.getId()); + return R.ok(testDemo1); + } + + /** + * 配置内容 + * encrypt-field: + algorithm: aes + encodeKey: A84DC2F738843E1A4170F053F5025F9A74164FFC158CB245570728CF00731803 + ivKey: 00000000000000000000000000000000 + encodeType: hex + */ + @GetMapping("/aes") + public R aes() { + //插入 + TestDemo testDemo = new TestDemo(); + testDemo.setTestKey("testkey"); + testDemo.setValue("testvalue"); + demoMapper.insert(testDemo); + //查询 + TestDemo testDemo1 = this.demoMapper.selectById(testDemo.getId()); + return R.ok(testDemo1); + } + + + /** + * 配置内容 + * encrypt-field: + algorithm: rsa + publicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCDt41GIcWvY6/tpjOLoWY78Oy00uWcNbMRG/8DRoS79/h2D+pV8uxV+0ezaN+fBFCZnK8TdJcPeU4EnNRUh/8HEY33KFvZ700n+Gj5BHUUDKzx3UVFNuF49UI/yoJ8rz6VQQHO79KK89VwmSMO77Tfee1ofe0STY6IwMt/MwaoKwIDAQAB + privateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIO3jUYhxa9jr+2mM4uhZjvw7LTS5Zw1sxEb/wNGhLv3+HYP6lXy7FX7R7No358EUJmcrxN0lw95TgSc1FSH/wcRjfcoW9nvTSf4aPkEdRQMrPHdRUU24Xj1Qj/KgnyvPpVBAc7v0orz1XCZIw7vtN957Wh97RJNjojAy38zBqgrAgMBAAECgYAkXx4qvI6rFNryw88+Am6JpMioUghHb2ioE9QCYomqohnA+DocS71JLN8qwo3lijp7gJGzzKEeC8Aoc+oKAZfBQQwPP0K/ql+NcLdlqNAr+XyzkZrLJD/BfluQ6mXI23tjonWnPPZ1Et9HC3zXRQPiuh7Ff6UoqatTMI3OIbSyuQJBAPbaJpVYmIsWJdpvaAC6hcGgR/vbG9yX8VphPn8/2wsm2MmQrRkUoKkudE/veX3KQjGikDwo9+bT6aBl+nn2DUUCQQCImSGZFNcGqhMLyRGVogP6fh0YZSEQAhFbZ69nQmplqbie+dREhODH5Vs5F0C2aL5iSR/UaIDkNEA1auX7x56vAkAFWjON927PTTqi4tmBconl6eDFsDmJbe34xLUDM1I/iqcWr8FhEtZs9Knm9c1PkewfgWPZOhYt9hhRtwRYUqJ1AkAPvQ0I9US9KNVe80DKa8tnjiZODEDd9k8HqA+mpxlZM0/pSUGyz1iSz5NOJaa4HaNp8aDwOUY4hOis/u8Wrm5TAkEA00YeUsaXlMyMF/5pjols44tXb54AjAC2mH66pz9JsKg7pKpWVOpEV5rMY58CGZHWau69vGLZnCd1coeMw77YAQ== + encodeType: base64 + */ + @GetMapping("/rsa") + public R rsa() { + //插入 + TestDemo testDemo = new TestDemo(); + testDemo.setTestKey("testkey"); + testDemo.setValue("testvalue"); + demoMapper.insert(testDemo); + //查询 + TestDemo testDemo1 = this.demoMapper.selectById(testDemo.getId()); + return R.ok(testDemo1); + } + + + /** + * 配置内容 + * encrypt-field: + algorithm: sm2 + publicKey: MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAESU5V56NTde1KYcp63wHEXxUyh2kwEVgVNhlQiqUQMbJJWyIDny7CW2lt71XGmm8sjmSkbGZYMcrM27H2wzp0Gw== + privateKey: MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgM6U/o1oR8swRomlNffyqE2tglhuUcWtPEFYrCsvGUa2gCgYIKoEcz1UBgi2hRANCAARJTlXno1N17UphynrfAcRfFTKHaTARWBU2GVCKpRAxsklbIgOfLsJbaW3vVcaabyyOZKRsZlgxyszbsfbDOnQb + encodeType: base64 + */ + @GetMapping("/sm2") + public R sm2() { + //插入 + TestDemo testDemo = new TestDemo(); + testDemo.setTestKey("testkey"); + testDemo.setValue("testvalue"); + demoMapper.insert(testDemo); + //查询 + TestDemo testDemo1 = this.demoMapper.selectById(testDemo.getId()); + return R.ok(testDemo1); + } + + /** + * 配置内容 + * encrypt-field: + algorithm: sm4 + encodeKey: 8qwo86o2psmakww2qe2mv0ivk5gru2op + encodeType: base64 + */ + @GetMapping("/sm4") + public R sm4() { + //插入 + TestDemo testDemo = new TestDemo(); + testDemo.setTestKey("testkey"); + testDemo.setValue("testvalue"); + demoMapper.insert(testDemo); + //查询 + TestDemo testDemo1 = this.demoMapper.selectById(testDemo.getId()); + return R.ok(testDemo1); + } + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java index dc19ce2c7..220bfae2b 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java @@ -2,6 +2,7 @@ package com.ruoyi.demo.domain; import com.baomidou.mybatisplus.annotation.*; import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.framework.handler.EncryptTypeHandler; import lombok.Data; import lombok.EqualsAndHashCode; @@ -13,7 +14,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = true) -@TableName("test_demo") +@TableName(value="test_demo", autoResultMap=true) public class TestDemo extends BaseEntity { private static final long serialVersionUID = 1L; @@ -44,11 +45,13 @@ public class TestDemo extends BaseEntity { /** * key键 */ + @TableField(typeHandler = EncryptTypeHandler.class) private String testKey; /** * 值 */ + @TableField(typeHandler = EncryptTypeHandler.class) private String value; /** diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index 52e1b0651..b89c58160 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -61,6 +61,11 @@ transmittable-thread-local + + org.bouncycastle + bcprov-jdk15to18 + + com.ruoyi diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/EncryptFieldProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/EncryptFieldProperties.java new file mode 100644 index 000000000..ed9fe8141 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/EncryptFieldProperties.java @@ -0,0 +1,46 @@ +package com.ruoyi.framework.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 加密字段属性配置 + * + * @author 老马 + * @date 2023-01-06 08:57 + */ +@Data +@Component +@ConfigurationProperties(prefix = "mybatis-plus.encrypt-field") +public class EncryptFieldProperties { + /** + * 算法名称 + */ + private String algorithm; + + /** + * 字符串的编码方式 + */ + private String encodeType; + + /** + * 非对称加密算法的公钥 + */ + private String publicKey; + + /** + * 非对称加密算法的私钥 + */ + private String privateKey; + + /** + * AES和SM4 的 秘钥 + */ + private String secretKey; + + /** + * AES 的 ivKey + */ + private String ivKey; +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/EncryptTypeHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/EncryptTypeHandler.java new file mode 100644 index 000000000..81067ac5b --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/EncryptTypeHandler.java @@ -0,0 +1,48 @@ +package com.ruoyi.framework.handler; + +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.config.properties.EncryptFieldProperties; +import com.ruoyi.framework.manager.EncryptorManager; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * 加解密字段处理 + * + * @author 老马 + * @date 2023-01-06 10:46 + */ +public class EncryptTypeHandler implements TypeHandler { + + /** + * 加解密管理者 + */ + private final EncryptorManager encryptorManager = SpringUtils.getBean(EncryptorManager.class); + private final EncryptFieldProperties properties = SpringUtils.getBean(EncryptFieldProperties.class); + + @Override + public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { + ps.setString(i, encryptorManager.encrypt(parameter, properties)); + } + + + @Override + public String getResult(ResultSet rs, String columnName) throws SQLException { + return encryptorManager.decrypt(rs.getString(columnName), properties); + } + + @Override + public String getResult(ResultSet rs, int columnIndex) throws SQLException { + return encryptorManager.decrypt(rs.getString(columnIndex), properties); + } + + @Override + public String getResult(CallableStatement cs, int columnIndex) throws SQLException { + return encryptorManager.decrypt(cs.getString(columnIndex), properties); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/EncryptorManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/EncryptorManager.java new file mode 100644 index 000000000..ec3a7c442 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/EncryptorManager.java @@ -0,0 +1,66 @@ +package com.ruoyi.framework.manager; + +import com.ruoyi.framework.config.properties.EncryptFieldProperties; +import com.ruoyi.framework.manager.encryptor.IEncryptor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 加解密管理者 + * + * @author 老马 + * @date 2023-01-06 09:19 + */ +@Slf4j +@Component +public class EncryptorManager { + @Resource + private List encryptors; + + /** + * 加密 + * @param value 待加密字符串 + * @param properties 加解密配置信息 + * @return 加密后的字符串 + * @throws Exception 抛出异常 + */ + public String encrypt(String value, EncryptFieldProperties properties) { + try { + for(IEncryptor encryptor : encryptors) { + if(encryptor.isMyAlgorithm(properties.getAlgorithm())) { + return encryptor.encrypt(value, properties); + } + } + //没有加解密执行者或者算法名找不到时,还是返回原字符串 + return value; + }catch (Exception e) { + log.error("字段加密异常,原样返回。异常信息:【{}】", e.getMessage()); + return value; + } + } + + /** + * 解密 + * @param value 待解密字符串 + * @param properties 加解密配置信息 + * @return 解密后的字符串 + * @throws Exception 抛出异常 + */ + public String decrypt(String value, EncryptFieldProperties properties) { + try { + for(IEncryptor encryptor : encryptors) { + if(encryptor.isMyAlgorithm(properties.getAlgorithm())) { + return encryptor.decrypt(value, properties); + } + } + //没有加解密执行者或者算法名找不到时,还是返回原字符串 + return value; + }catch(Exception e) { + log.error("字段解密异常,原样返回。异常信息:【{}】", e.getMessage()); + return value; + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/AesEncryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/AesEncryptor.java new file mode 100644 index 000000000..38bf28b4c --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/AesEncryptor.java @@ -0,0 +1,72 @@ +package com.ruoyi.framework.manager.encryptor; + +import cn.hutool.core.util.HexUtil; +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.AES; +import com.ruoyi.common.enums.AlgorithmType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.config.properties.EncryptFieldProperties; +import com.ruoyi.framework.manager.encryptor.IEncryptor; +import org.springframework.stereotype.Component; + +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +/** + * AES算法实现 + * + * @author 老马 + * @date 2023-01-06 11:39 + */ +@Component +public class AesEncryptor implements IEncryptor { + + /** + * 是否为本加解密处理的算法名称 + * + * @param algorithm 算法名称 + * @return 是否本类能处理的算法 + */ + @Override + public Boolean isMyAlgorithm(String algorithm) { + return StringUtils.equalsIgnoreCase(algorithm, AlgorithmType.AES.getAlgorithm()); + } + + /** + * AES加密 + * + * @param value 待加密字符串 + * @param properties 加解密配置信息 + * @return 加密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String encrypt(String value, EncryptFieldProperties properties) throws Exception { + + AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, + new SecretKeySpec(HexUtil.decodeHex(properties.getSecretKey()), StringUtils.toRootUpperCase(properties.getAlgorithm())), + new IvParameterSpec(HexUtil.decodeHex(properties.getIvKey()))); + if(StringUtils.endsWithIgnoreCase(properties.getEncodeType(), IEncryptor.ENCODETYPE_HEX)) { + return aes.encryptHex(value); + }else { + return aes.encryptBase64(value); + } + } + + /** + * AES解密 + * + * @param value 待解密字符串 + * @param properties 加解密配置信息 + * @return 解密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String decrypt(String value, EncryptFieldProperties properties) throws Exception { + AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, + new SecretKeySpec(HexUtil.decodeHex(properties.getSecretKey()), properties.getAlgorithm()), + new IvParameterSpec(HexUtil.decodeHex(properties.getIvKey()))); + return aes.decryptStr(value); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Base64Encryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Base64Encryptor.java new file mode 100644 index 000000000..47bf4dfcf --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Base64Encryptor.java @@ -0,0 +1,54 @@ +package com.ruoyi.framework.manager.encryptor; + +import cn.hutool.core.codec.Base64; +import com.ruoyi.common.enums.AlgorithmType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.config.properties.EncryptFieldProperties; +import com.ruoyi.framework.manager.encryptor.IEncryptor; +import org.springframework.stereotype.Component; + +/** + * Base64算法实现。不建议在生产环境使用 + * + * @author 老马 + * @date 2023-01-06 10:00 + */ +@Component +public class Base64Encryptor implements IEncryptor { + /** + * 是否为本加解密处理的算法名称 + * + * @param algorithm 算法名称 + * @return 是否本类能处理的算法 + */ + @Override + public Boolean isMyAlgorithm(String algorithm) { + return StringUtils.equalsIgnoreCase(algorithm, AlgorithmType.BASE64.getAlgorithm()); + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param properties 加解密配置信息 + * @return 加密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String encrypt(String value, EncryptFieldProperties properties) throws Exception { + return Base64.encode(value); + } + + /** + * 解密 + * + * @param value 待解密字符串 + * @param properties 加解密配置信息 + * @return 解密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String decrypt(String value, EncryptFieldProperties properties) throws Exception { + return Base64.decodeStr(value); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/IEncryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/IEncryptor.java new file mode 100644 index 000000000..b691d654e --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/IEncryptor.java @@ -0,0 +1,42 @@ +package com.ruoyi.framework.manager.encryptor; + +import com.ruoyi.framework.config.properties.EncryptFieldProperties; + +/** + * 加解密执行者 + * + * @author 老马 + * @date 2023-01-06 09:20 + */ +public interface IEncryptor { + /** + * 编码类型-16进制 + */ + String ENCODETYPE_HEX = "hex"; + + /** + * 是否为本加解密处理的算法名称 + * @param algorithm 算法名称 + * @return 是否本类能处理的算法 + */ + Boolean isMyAlgorithm(String algorithm); + + /** + * 加密 + * @param value 待加密字符串 + * @param properties 加解密配置信息 + * @return 加密后的字符串 + * @throws Exception 抛出异常 + */ + String encrypt(String value, EncryptFieldProperties properties) throws Exception; + + /** + * 解密 + * @param value 待解密字符串 + * @param properties 加解密配置信息 + * @return 解密后的字符串 + * @throws Exception 抛出异常 + */ + String decrypt(String value, EncryptFieldProperties properties) throws Exception; + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/RsaEncryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/RsaEncryptor.java new file mode 100644 index 000000000..9ca0b90d8 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/RsaEncryptor.java @@ -0,0 +1,62 @@ +package com.ruoyi.framework.manager.encryptor; + +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import com.ruoyi.common.enums.AlgorithmType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.config.properties.EncryptFieldProperties; +import com.ruoyi.framework.manager.encryptor.IEncryptor; +import org.springframework.stereotype.Component; + +/** + * RSA算法实现 + * + * @author 老马 + * @date 2023-01-06 09:37 + */ +@Component +public class RsaEncryptor implements IEncryptor { + /** + * 是否为本加解密处理的算法名称 + * + * @param algorithm 算法名称 + * @return 是否本类能处理的算法 + */ + @Override + public Boolean isMyAlgorithm(String algorithm) { + return StringUtils.equalsIgnoreCase(algorithm, AlgorithmType.RSA.getAlgorithm()); + } + + /** + * 公钥加密 + * 需要从properties读取公私钥信息 + * + * @param value 待加密字符串 + * @param properties 加解密配置信息 + * @return 加密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String encrypt(String value, EncryptFieldProperties properties) throws Exception { + RSA rsa = new RSA(properties.getPrivateKey(), properties.getPublicKey()); + if(StringUtils.endsWithIgnoreCase(properties.getEncodeType(), IEncryptor.ENCODETYPE_HEX)) { + return rsa.encryptHex(value, KeyType.PublicKey); + }else { + return rsa.encryptBase64(value, KeyType.PublicKey); + } + } + + /** + * 私钥解密 + * + * @param value 待解密字符串 + * @param properties 加解密配置信息 + * @return 解密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String decrypt(String value, EncryptFieldProperties properties) throws Exception { + RSA rsa = new RSA(properties.getPrivateKey(), properties.getPublicKey()); + return rsa.decryptStr(value, KeyType.PrivateKey); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Sm2Encryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Sm2Encryptor.java new file mode 100644 index 000000000..4b6f2d085 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Sm2Encryptor.java @@ -0,0 +1,62 @@ +package com.ruoyi.framework.manager.encryptor; + +import cn.hutool.crypto.SmUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.SM2; +import com.ruoyi.common.enums.AlgorithmType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.config.properties.EncryptFieldProperties; +import com.ruoyi.framework.manager.encryptor.IEncryptor; +import org.springframework.stereotype.Component; + +/** + * sm2算法实现 + * + * @author 老马 + * @date 2023-01-06 17:13 + */ +@Component +public class Sm2Encryptor implements IEncryptor { + /** + * 是否为本加解密处理的算法名称 + * + * @param algorithm 算法名称 + * @return 是否本类能处理的算法 + */ + @Override + public Boolean isMyAlgorithm(String algorithm) { + return StringUtils.equalsIgnoreCase(algorithm, AlgorithmType.SM2.getAlgorithm()); + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param properties 加解密配置信息 + * @return 加密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String encrypt(String value, EncryptFieldProperties properties) throws Exception { + SM2 sm2 = SmUtil.sm2(properties.getPrivateKey(), properties.getPublicKey()); + if(StringUtils.endsWithIgnoreCase(properties.getEncodeType(), IEncryptor.ENCODETYPE_HEX)) { + return sm2.encryptHex(value, KeyType.PublicKey); + }else { + return sm2.encryptBase64(value, KeyType.PublicKey); + } + } + + /** + * 解密 + * + * @param value 待解密字符串 + * @param properties 加解密配置信息 + * @return 解密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String decrypt(String value, EncryptFieldProperties properties) throws Exception { + SM2 sm2 = SmUtil.sm2(properties.getPrivateKey(), properties.getPublicKey()); + return sm2.decryptStr(value, KeyType.PrivateKey); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Sm4Encryptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Sm4Encryptor.java new file mode 100644 index 000000000..1443facaa --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/encryptor/Sm4Encryptor.java @@ -0,0 +1,60 @@ +package com.ruoyi.framework.manager.encryptor; + +import cn.hutool.crypto.symmetric.SymmetricCrypto; +import com.ruoyi.common.enums.AlgorithmType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.config.properties.EncryptFieldProperties; +import com.ruoyi.framework.manager.encryptor.IEncryptor; +import org.springframework.stereotype.Component; + +/** + * sm4算法实现 + * + * @author 老马 + * @date 2023-01-06 17:40 + */ +@Component +public class Sm4Encryptor implements IEncryptor { + /** + * 是否为本加解密处理的算法名称 + * + * @param algorithm 算法名称 + * @return 是否本类能处理的算法 + */ + @Override + public Boolean isMyAlgorithm(String algorithm) { + return StringUtils.equalsIgnoreCase(algorithm, AlgorithmType.SM4.getAlgorithm()); + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param properties 加解密配置信息 + * @return 加密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String encrypt(String value, EncryptFieldProperties properties) throws Exception { + SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding", properties.getSecretKey().getBytes()); + if(StringUtils.endsWithIgnoreCase(properties.getEncodeType(), IEncryptor.ENCODETYPE_HEX)) { + return sm4.encryptHex(value); + }else { + return sm4.encryptBase64(value); + } + } + + /** + * 解密 + * + * @param value 待解密字符串 + * @param properties 加解密配置信息 + * @return 解密后的字符串 + * @throws Exception 抛出异常 + */ + @Override + public String decrypt(String value, EncryptFieldProperties properties) throws Exception { + SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding", properties.getSecretKey().getBytes()); + return sm4.decryptStr(value); + } +}