在使用springboot开发web程序的过程中,会涉及到使用数据库,一般我们会将连接数据库的用户名和密码直接写在配置文件application.properties里。
spring.datasource.driver-class-name=com.mysql.jdbc.Driver #数据库驱动
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
这样填写无疑是让数据库裸奔,任何看过这个配置文件的人都可以获得用户名和密码,然后可以使用数据连接工具连接数据库,从而窃取数据库里的数据,或者直接删库跑路。
因此在配置文件中,我们不能直接填写用户名和密码,而是应该先对用户名和密码进行加密处理后再填写。
首先在java.security包中随便选择一种加密算法,对数据库的用户名和密码加密
然后将密文填写到配置文件中:(这里采用简单的BASE64编码)
spring.datasource.driver-class-name=com.mysql.jdbc.Driver #数据库驱动
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username= cm9vdA==
spring.datasource.password= cm9vdA==
现在关键的来了,如果直接运行程序,将会报数据库连接错误,这是因为用户名和密码都是密文,数据库无法识别。因此我们需要在应用程序连接数据库之前对密文进行解密。
springboot读取配置文件中数据的流程如下图:
根据配置文件的读取流程,我们可以想到两种方案;
第一种方法:
首先根据上面的流程配置文件中的用户名和密码会被读到一个bean里面,然后bean会被存放在一级缓存中,因此我们可以在存放前拦截到记录数据库连接信息的bean,然后找到用户名和密码。并解密后重新赋值。
,在我使用的com.alibaba.druid.pool.DruidDataSource的数据池中,信息就是被读取到DruidDataSource的bean里,
接下来需要实现BeanPostProcessor接口对bean进行拦截,并解密用户名和密码。
第二总种方法是直接使用配置类将application.properties中的用户名和密码读取出来解密后重新配置。这里略过。