springboot 项目可以动态获取数据库配置吗?

2023-02-23 10:07:15 +08:00
 godleon

需求

例 springboot 项目,里面会有 mysql 配置如下:

 spring:
  datasource:
    #数据源基本配置
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:9999/database_v2
    

想问问怎么能把这个配置在上线的时候隐藏掉?或者动态获取、自己能控制最好

4403 次点击
所在节点    程序员
50 条回复
mosliu
2023-02-23 11:20:50 +08:00
@godleon 从 c1 自己部署一个 api 可以 put 数据库的配置,单独记录到文件中。 然后在连接池初始化的地方,从文件中读取不就行了。。
mosliu
2023-02-23 11:23:35 +08:00
文件做加密。要是说有人再进程序查看加密等的情况,那就没治了。
litchinn
2023-02-23 11:25:01 +08:00
@godleon 根据你的附言第 4 条描述,配置中心也是没用的,服务器别人可以访问,而你不行,那么别人可以拿到 jar 包,即使你使用了配置中心,配置中心的用户密码链接信息不一样写在配置文件吗?配置中心本质和你附言第 4 条说的接口调用方式是一回事。
那么换个角度,你无法阻止别人拿到信息,那么是否可以从信息加密上做文章呢。
Jtyczc
2023-02-23 11:27:31 +08:00
直接 docker 启动一个 nacos ,很快啊
leeraya
2023-02-23 11:28:02 +08:00
apollo
godleon
2023-02-23 11:40:20 +08:00
@Jtyczc
1.你得下个 docker
2.拉个 nacos 镜像
3.持久化 nacos 配置到 db 或者本地
4.你需要映射和暴露 nacos 端口,改安全组
5.你需要项目里加 springcloud-alibaba-nacos 依赖
VersionGod1
2023-02-23 11:44:12 +08:00
打 war 包,部署的时候直接改配置类?
VersionGod1
2023-02-23 11:45:10 +08:00
看错问题了,不好意思
jorneyr
2023-02-23 12:02:01 +08:00
SpringBoot 项目里配置 Jasypt 加密一下就好。
dabai0806
2023-02-23 12:04:22 +08:00
数据库连接信息单独放个数据库表里面
chrisliu1314
2023-02-23 12:12:05 +08:00
通过 jvm 参数传进去,就不需要配置中心了
bill110100711
2023-02-23 12:14:06 +08:00
结合七楼的方法,把你的用户名密码加密后用请求传过来,解密用的盐可以放到代码里,代码编译时加混淆。
godleon
2023-02-23 13:02:30 +08:00
@chrisliu1314 目前就是这种方式
cslive
2023-02-23 13:41:09 +08:00
jndi 数据源
zhaokun
2023-02-23 13:43:20 +08:00
你是不让别人看到有数据库连接还是说不想让别人拿到数据库连接账户密码?如果是后者不放铭文不就好了
lower
2023-02-23 14:32:25 +08:00
感觉你需要的是 数据服务化 ,通过 api 暴露数据的存取,而不是直接数据库暴露;
搞一套类似 PostgREST 的接口,暴露对数据的操作
miaotaizi
2023-02-23 14:54:17 +08:00
springboot 项目用 docker 打包, 读取 docker 容器内的环境变量, 启动 docker 的时候注入变量就行了?
xiaocaiji111
2023-02-23 15:14:42 +08:00
可以,我们之前项目不允许直连 mysql ,必须请求一个中间服务获取一次性密码初始化 datasource ,配置什么都在这个中间服务。
具体实现原理估计不难,百度下,很久没看了。
OldCarMan
2023-02-23 15:25:26 +08:00
🤔如果换种方式保证你说的“db 安全”,比如动态修改数据库密码,不知道能否满足你的需求,如果满足,加上你的 springboot 项目跟你的 mysql 是部署在同一台服务器的话?你看看可以不可以这样子:

写个脚本调用 mysql 修改数据库密码的命令,每隔一段时间动态修改一次 mysql 的密码,并把相应密码写入环境变量 /配置文件 /jvm 参数?这样可能可以实现你附言 2 的需求,同时你还可以给该脚本增加手动更新密码的过程,但有点牺牲服务可用性和并且是代码侵入式的,比如你在调用服务接口查数据库时,这时数据库密码改了,服务就会报错,当然你可以采用变量判断的方式,当脚本在修改数据库密码时,给一个变量赋值,然后服务代码里有一个该变量的判断、让接口等待数据返回的过程。

不过话说回来,你这些“安全需求”,个人觉得都有点“伪需求”的意思,因为凡是影响一件事的因素是多样的时候,就有一个木桶效应,修改数据库配置这种需求,只能增加获取数据库配置的“难度”,但你没法避免别人拿到这些信息,最重要的应该是避免服务器被非信任方使用 /入侵,还有事在人为,很多安全事故都是人祸,管理好服务器使用者也是很有必要的。
a728976009
2023-02-23 15:44:25 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/918435

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX