From 8865981c04191742bbc6118651edddf79733af28 Mon Sep 17 00:00:00 2001 From: "yunpeng.zhang" Date: Mon, 31 Jul 2023 12:11:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=95=E5=85=A5jasypt=20encryption=20?= =?UTF-8?q?=E5=AF=B9=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E3=80=81=E8=A7=A3=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 21 ++++++++++++-- doc/runConfig.png | Bin 0 -> 52400 bytes pom.xml | 6 ++++ src/main/resources/application-dev.yml | 4 +-- src/main/resources/application-prod.yml | 4 +-- src/main/resources/application.yml | 14 +++++---- .../peng/answerbi/manager/EncryptorTest.java | 27 ++++++++++++++++++ 7 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 doc/runConfig.png create mode 100644 src/test/java/top/peng/answerbi/manager/EncryptorTest.java diff --git a/README.md b/README.md index b4683b6..8f84fd9 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,22 @@ yuapi: 配置完成启动项目,访问 `http://localhost:8101/api/doc.html` 即可打开接口文档 +> **ENC加密配置文件中的内容** +> +> 1) 使用EncryptorTest.java对你需要加密的内容加密,获取密文,在配置文件进行替换 +> ```yaml +> spring: +> datasource: +> password: ENC(加密后的密文) +> ``` +> 2) 启动时指定环境变量 ${ENCRYPTOR_PASSWORD} +> - idea +> ![启动配置](doc/runConfig.png) +> - 命令行启动 +> ```shell +> java -jar answerBi-backend.jar --ENCRYPTOR_PASSWORD=xxx +> ``` + ### [前端](https://gitee.com/anscoder/answer-bi-frontend) 1)执行 npm install 或 yarn 安装依赖 ```shell @@ -125,10 +141,11 @@ yarn run dev - [x] 使用死信队列处理异常情况,将图表生成任务置为失败 - [x] 引入Guava RateLimiter(单机) 和 Redisson RateLimiter(分布式) 两种限流机制 - [x] 支持用户对失败的图表进行手动重试 -- [ ] 图表数据分表存储,提高查询灵活性和性能 - [x] 引入redis缓存提高加载速度 +- [x] 引入jasypt encryption 对配置文件加密、解密 +- [ ] 图表数据分表存储,提高查询灵活性和性能 - [ ] 给任务执行增加 guava Retrying重试机制,保证系统可靠性 - [ ] 定时任务把失败状态的图表放到队列中(补偿机制) - [ ] 给任务的执行增加超时时间,超时自动标记为失败(超时控制) - [ ] 任务执行结果通过websocket实时通知给用户 -- [ ] 我的图表管理页增加一个刷新、定时刷新的按钮,保证获取到图表的最新状态(前端轮询) \ No newline at end of file +- [ ] 我的图表管理页增加一个刷新、定时刷新的按钮,保证获取到图表的最新状态(前端轮询) diff --git a/doc/runConfig.png b/doc/runConfig.png new file mode 100644 index 0000000000000000000000000000000000000000..fecf3b8fed7d9b4248c7cbdd7409a07e8e6dfa3f GIT binary patch literal 52400 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

$===xp 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 4f27f41..1583315 100644 --- a/pom.xml +++ b/pom.xml @@ -137,6 +137,12 @@ redisson 3.21.3 + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 3.0.5 + diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 3f915eb..7bf4065 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -7,7 +7,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/answer_bi username: root - password: 123456 + password: ENC(W22KZePz8XkyZFkevBe50CCkRC+72Ql+5JJlrJJs/WKLe6FaZHG/hCL84pgH7Xre) # Redis 配置 # todo 需替换配置 redis: @@ -15,7 +15,7 @@ spring: host: localhost port: 6379 timeout: 5000 - password: 123456 + password: ENC(fSQ1SjW1aMVBfbTIO/+FCKgywMK+MfCqJbGxGz6sDpnZaVi1l73H0kpPazxV5Tb7) # rabbitMq 配置 rabbitmq: host: localhost diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index a4105a3..5ad819c 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -6,14 +6,14 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/answer_bi username: root - password: 123456 + password: ENC(W22KZePz8XkyZFkevBe50CCkRC+72Ql+5JJlrJJs/WKLe6FaZHG/hCL84pgH7Xre) # Redis 配置 redis: database: 1 host: localhost port: 6379 timeout: 5000 - password: 123456 + password: ENC(fSQ1SjW1aMVBfbTIO/+FCKgywMK+MfCqJbGxGz6sDpnZaVi1l73H0kpPazxV5Tb7) # rabbitMq 配置 rabbitmq: host: localhost diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4a9a954..7d782d7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -16,16 +16,16 @@ spring: # 数据库配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/my_db + url: jdbc:mysql://localhost:3306/answer_bi username: root - password: 123456 + password: ENC(W22KZePz8XkyZFkevBe50CCkRC+72Ql+5JJlrJJs/WKLe6FaZHG/hCL84pgH7Xre) # Redis 配置 redis: database: 1 host: localhost port: 6379 timeout: 5000 - password: 123456 + password: ENC(fSQ1SjW1aMVBfbTIO/+FCKgywMK+MfCqJbGxGz6sDpnZaVi1l73H0kpPazxV5Tb7) # rabbitMq 配置 rabbitmq: host: localhost @@ -88,5 +88,9 @@ cos: yuapi: client: - access-key: xyjjaiosvyjxfk4t98g0qlrplfijigrz - secret-key: q6lppq8sdz587jggbttg35nrsj1iyofl \ No newline at end of file + access-key: ENC(v27uTfT5pLqgnpL5glE1dJGChWOzY9ODw/kXrvZ/YO4vbWpyjbI80nclIm2neceZwN7rCiexSFhmrXEu18eZsyfOlU5IfbwFAITBPg/GJ2I=) + secret-key: ENC(5Gn5+7922Qg1Ru3VrzVMkX/PdKou6DfzaTKS2tKetd1Z7PXsNY0Pv6GNXIZwzkb2z2+OKU40XKRdPH57Ds/D0p6338kbMUg704Wj8INOWhI=) + +jasypt: + encryptor: + password: ${ENCRYPTOR_PASSWORD} \ No newline at end of file diff --git a/src/test/java/top/peng/answerbi/manager/EncryptorTest.java b/src/test/java/top/peng/answerbi/manager/EncryptorTest.java new file mode 100644 index 0000000..0d167ea --- /dev/null +++ b/src/test/java/top/peng/answerbi/manager/EncryptorTest.java @@ -0,0 +1,27 @@ +package top.peng.answerbi.manager; + +import org.jasypt.encryption.StringEncryptor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * AiManagerTest + * + * @author yunpeng + * @version 1.0 2023/7/14 + */ +@SpringBootTest +class EncryptorTest { + + @Autowired + private StringEncryptor stringEncryptor; + + @Test + void encode() { + String password = "123456"; + + System.out.println( "加密密文:" + stringEncryptor.encrypt(password)); + System.out.println("解密密文:" + stringEncryptor.decrypt(stringEncryptor.encrypt(password))); + } +} \ No newline at end of file