前言
有些情况下,我们需要对apllication.yml 配置文件中的数据库用户名、密码进行加密,那么当程序启动的时候我们就需要解密。虽然mybatis-plus 已经支持加密解密功能,但对于我们自定义的加密解密方法,还是需要自己解决,单数据源的情况下,可以重写dataSource实现。对于多数据源,如何解密并顺利切换数据源呢?大家可以试试下面的方法。
代码示例
mybatis-plus 版本
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
application.yml 配置
spring:
datasource:
dynamic:
primary: actual
datasource:
actual:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@ip:port:orcl
username: ACTUAL
password: ACTUAL
gjk:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:ip:port:1521:orcl
username: gsMdcorB3aiPCpUrmA0S2ur29giMJZjMbohFuF0OB3DcHEwpg/UZzsiy1pj3/yXDkPOj5qP3sySji42QOq+wbQ==
password: OFfW3pzlFiwTf6P69CbXmV42judK4Cvnns9itNiyBSRhBtFoh8LLxyCT98z5vJh1SyePqjMtBF6jr9l9TgUn1g==
ystr:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@ip:port:1521:orcl
username: ys
password: ys
解密
我们需要对上面配置文件中的 gjk 的数据源进行解密,解密方法如下:
@Configuration
@Qualifier("myDataSourceConfig")
@Primary
public class DataSourceConfig extends DynamicDataSourceProperties {
@Autowired
private Environment env;
@Bean
public DynamicDataSourceProvider handleData() throws Exception{
Map<String, DataSourceProperty> datasource = getDatasource();
DataSourceProperty gjk = datasource.get("gjk");
String username = env.getProperty("spring.datasource.dynamic.datasource.gjk.username");
String password = env.getProperty("spring.datasource.dynamic.datasource.gjk.password");
String localServerNo = env.getProperty("localServerNo");
gjk.setUsername(SymmetricEncoderUtils.decrypt(username, localServerNo));
gjk.setPassword(SymmetricEncoderUtils.decrypt(password, localServerNo));
datasource.put("gjk",gjk);
return new YmlDynamicDataSourceProvider(datasource);
}
}
代码中的 SymmetricEncoderUtils.decrypt(username, localServerNo) 为自定义的解密方法。大家可以根据实际情况换成自己的解密方法。