赞
踩
配置文件中展示了密码明文,审查不允许,要求加密。
1.添加依赖 ,加密密码
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid-spring-boot-starter</artifactId>
- <version>${druid.version}</version>
- </dependency>
2.加密密码,
找到jar包druid-1.1.9.jar,注意这个jar包和上面的不是一个,在这个jar包的位置下,进入cmd,使用命令实现加密
java -cp druid-1.1.9.jar com.alibaba.druid.filter.config.ConfigTools 你的密码 >a.txt,
复制 公钥publickey和加密后的密码password,在配置文件中将密码替换成加密后的,并添加下面两个配置
- public-key=你生成的公钥
- spring.datasource.druid.filter.config.enabled=true
- spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
首先你的代码中dao类和mpper类是否根据数据源分包,不然我下面的方法没有办法实现。
多数据源配置
- @Configuration
- public class MultiDataSourceConfig {
-
- @Bean(name = "datasource1")//数据源名称1
- @ConfigurationProperties(prefix = "spring.datasource.druid.datasource1")
- public DataSource dataSource1() {
- return new DruidDataSource();
- }
-
-
- @Bean(name = "server")//数据源名称2
- @ConfigurationProperties(prefix = "spring.datasource.druid.server")
- public DataSource dataSource2() {
- return new DruidDataSource();
- }
-
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
具体单个数据源配置,这里只是一个数据源,另外一个数据源也要配置,只需要替换参数就可以。
- @Configuration
- @MapperScan(basePackages = "cn.com.hello.zydt.dao", sqlSessionTemplateRef = "test2SqlSessionTemplate")//这里指定数据源对应的dao包,和另外一个数据源不能重合
- public class DataSource2Config {
-
- @Bean(name = "test2SqlSessionFactory")
- public SqlSessionFactory testSqlSessionFactory(@Qualifier("server") DataSource dataSource) throws Exception {//这里的server是数据源的名称
- SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
- bean.setDataSource(dataSource);
- bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:config/mappers/*" +//执行的对应xml文件路径
- ".xml"));
- return bean.getObject();
- }
-
- @Bean(name = "test2TransactionManager")
- public DataSourceTransactionManager testTransactionManager(@Qualifier("server") DataSource dataSource) {//同样是数据源名称
- return new DataSourceTransactionManager(dataSource);
- }
-
- @Bean(name = "test2SqlSessionTemplate")
- public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
- return new SqlSessionTemplate(sqlSessionFactory);
- }
-
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
druid自定义解密回调函数
不同于单个数据加密,多数据源加密需要配置回调函数
- public class DbPasswordCallback extends DruidPasswordCallback {
-
- private static final Logger logger = LoggerFactory.getLogger(DbPasswordCallback.class);
-
- @Override
- public void setProperties(Properties properties){
- super.setProperties(properties);
- String publickey = "";
- //获取application里面配置的密码和公钥
- String password = (String) properties.get("password");
- publickey = (String) properties.get("publicKey");
- try {
- String dbpassword = ConfigTools.decrypt(publickey, password);
- setPassword(dbpassword.toCharArray());
- } catch (Exception e) {
- logger.error("Druid ConfigTools.decrypt", e);
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
修改配置文件
- public-key = 你生成的公钥
- spring.datasource.druid.server.name=server//指定数据源名称
- spring.datasource.druid.server.filter.config.enabled=true
- spring.datasource.druid.server.connection-properties=config.decrypt=true;publicKey=${public-key};password=${spring.datasource.password}
- spring.datasource.druid.server.password-callback-class-name = xxx.xxx.DbPasswordCallback//指定解密函数
上面的方法如果dao类本来分包了,要改动的地方就很少,而且不用添加jar包。但如果不是,就需要自己分包,改动是一个大工程。jasypt是一个专门加密的包,可以对任何配置项进行加密。
1.添加依赖
- <dependency>
- <groupId>com.github.ulisesbocchio</groupId>
- <artifactId>jasypt-spring-boot-starter</artifactId>
- <version>3.0.4</version>
- </dependency>
2.对密码进行加密
- public class JasyptUtil {
-
-
- /**
- * 解密方法
- * @param password
- * @param value
- * @return
- */
- private static String decyptPwd(String password, String value) {
- PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
- encryptor.setConfig(cryptor(password));
- return encryptor.decrypt(value);
- }
- /**
- * 加密方法
- * @param password
- * @param value
- * @return
- */
- private static String encyptPwd(String password, String value) {
- PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
- encryptor.setConfig(cryptor(password));
- return encryptor.encrypt(value);
- }
-
- /**
- * 配置信息
- * @param password
- * @return
- */
- private static SimpleStringPBEConfig cryptor(String password) {
- SimpleStringPBEConfig config = new SimpleStringPBEConfig();
- config.setPassword(password);
- config.setAlgorithm("PBEWithMD5AndDES");
- config.setKeyObtentionIterations("1000");
- config.setPoolSize("1");
- config.setProviderName("SunJCE");
- config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
- config.setStringOutputType("base64");
- return config;
- }
-
- /* public static void main(String[] args) {
- String slat = "cfds";
- // 加密
- String encPwd = encyptPwd(slat, "未加密的密码");
- //解密
- String decPwd = decyptPwd(slat, encPwd);
- System.out.println("加密后的密码:" + encPwd);
-
- }*/
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
3.配置信息修改
- #加密配置项
- jasypt.encryptor.password=cfds//加密的密钥
- jasypt.encryptor.algorithm=PBEWithMD5AndDES//指定了加密算法
- jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator//指定了初始化向量(IV)生成器的类名
-
-
- #加密后的密码
- spring.datasource.server.password=ENC(vydZNCy0vVNFhdrV+R94Ki)
记录使用,欢迎交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。