✨ 添加新特性。支持多数据源密码加密

This commit is contained in:
冷冷 committed 2019-04-01 07:34:48 +08:00
1 parent 04d0b833ca
commit c740fd6693
6 files changed
+109 -24

No files matched your search

@@ -1,8 +1,11 @@
package com.pig4cloud.pigx.codegen.config;
import com.mysql.cj.jdbc.Driver;
import com.pig4cloud.pigx.codegen.util.DataSourceConstant;
import com.zaxxer.hikari.HikariDataSource;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.StringEncryptor;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -30,6 +33,7 @@ import java.util.Optional;
public class DynamicDataSourceConfig implements TransactionManagementConfigurer {
private final Map<Object, Object> dataSourceMap = new HashMap<>(8);
private final DataSourceProperties dataSourceProperties;
private final StringEncryptor stringEncryptor;
@Bean("dynamicDataSource")
public DynamicDataSource dataSource() {
@@ -56,17 +60,18 @@ public class DynamicDataSourceConfig implements TransactionManagementConfigurer
dds.setUsername(dataSourceProperties.getUsername());
dds.setPassword(dataSourceProperties.getPassword());
String sql = "select * from sys_datasource_conf where del_flag = '0' ";
List<Map<String, Object>> dbList = new JdbcTemplate(dds).queryForList(sql);
List<Map<String, Object>> dbList = new JdbcTemplate(dds).queryForList(DataSourceConstant.QUERY_DS_SQL);
log.info("开始 -> 初始化动态数据源");
Optional.of(dbList).ifPresent(list -> list.forEach(db -> {
log.info("数据源:{}", db.get("name"));
log.info("数据源:{}", db.get(DataSourceConstant.DS_NAME));
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(String.valueOf(db.get("url")));
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUsername(String.valueOf(db.get("username")));
ds.setPassword(String.valueOf(db.get("password")));
dataSourceMap.put(db.get("id"), ds);
ds.setJdbcUrl(String.valueOf(db.get(DataSourceConstant.DS_JDBC_URL)));
ds.setDriverClassName(Driver.class.getName());
ds.setUsername((String) db.get(DataSourceConstant.DS_NAME));
String decPwd = stringEncryptor.decrypt((String) db.get(DataSourceConstant.DS_USER_PWD));
ds.setPassword(decPwd);
dataSourceMap.put(db.get(DataSourceConstant.DS_ROUTE_KEY), ds);
}));
log.info("完毕 -> 初始化动态数据源,共计 {} 条", dataSourceMap.size());
@@ -75,11 +80,12 @@ public class DynamicDataSourceConfig implements TransactionManagementConfigurer
/**
* 重新加载数据源配置
*/
public void reload() {
public Boolean reload() {
init();
DynamicDataSource dataSource = dataSource();
dataSource.setTargetDataSources(dataSourceMap);
dataSource.afterPropertiesSet();
return Boolean.FALSE;
}
@@ -93,5 +99,4 @@ public class DynamicDataSourceConfig implements TransactionManagementConfigurer
return txManager();
}
}
@@ -18,7 +18,6 @@ package com.pig4cloud.pigx.codegen.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.codegen.config.DynamicDataSourceConfig;
import com.pig4cloud.pigx.codegen.entity.SysDatasourceConf;
import com.pig4cloud.pigx.codegen.service.SysDatasourceConfService;
import com.pig4cloud.pigx.common.core.util.R;
@@ -37,7 +36,6 @@ import org.springframework.web.bind.annotation.*;
@AllArgsConstructor
@RequestMapping("/dsconf")
public class SysDsConfController {
private final DynamicDataSourceConfig dynamicDataSourceConfig;
private final SysDatasourceConfService sysDatasourceConfService;
/**
@@ -83,9 +81,7 @@ public class SysDsConfController {
@SysLog("新增数据源表")
@PostMapping
public R save(@RequestBody SysDatasourceConf sysDatasourceConf) {
sysDatasourceConfService.save(sysDatasourceConf);
dynamicDataSourceConfig.reload();
return new R<>();
return new R<>(sysDatasourceConfService.saveDsByEnc(sysDatasourceConf));
}
/**
@@ -97,9 +93,7 @@ public class SysDsConfController {
@SysLog("修改数据源表")
@PutMapping
public R updateById(@RequestBody SysDatasourceConf sysDatasourceConf) {
sysDatasourceConfService.updateById(sysDatasourceConf);
dynamicDataSourceConfig.reload();
return new R<>();
return new R<>(sysDatasourceConfService.updateDsByEnc(sysDatasourceConf));
}
/**
@@ -111,9 +105,7 @@ public class SysDsConfController {
@SysLog("删除数据源表")
@DeleteMapping("/{id}")
public R removeById(@PathVariable Integer id) {
sysDatasourceConfService.removeById(id);
dynamicDataSourceConfig.reload();
return new R<>();
return new R<>(sysDatasourceConfService.removeById(id));
}
}
@@ -47,15 +47,15 @@ public class SysDatasourceConf extends Model<SysDatasourceConf> {
*/
private String name;
/**
*
* jdbcurl
*/
private String url;
/**
*
* 用户名
*/
private String username;
/**
*
* 密码
*/
private String password;
/**
@@ -26,5 +26,19 @@ import com.pig4cloud.pigx.codegen.entity.SysDatasourceConf;
* @date 2019-03-31 16:00:20
*/
public interface SysDatasourceConfService extends IService<SysDatasourceConf> {
/**
* 保存数据源并且加密
*
* @param sysDatasourceConf
* @return
*/
Boolean saveDsByEnc(SysDatasourceConf sysDatasourceConf);
/**
* 更新数据源
*
* @param sysDatasourceConf
* @return
*/
Boolean updateDsByEnc(SysDatasourceConf sysDatasourceConf);
}
@@ -16,10 +16,14 @@
*/
package com.pig4cloud.pigx.codegen.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pig4cloud.pigx.codegen.config.DynamicDataSourceConfig;
import com.pig4cloud.pigx.codegen.entity.SysDatasourceConf;
import com.pig4cloud.pigx.codegen.mapper.SysDatasourceConfMapper;
import com.pig4cloud.pigx.codegen.service.SysDatasourceConfService;
import lombok.AllArgsConstructor;
import org.jasypt.encryption.StringEncryptor;
import org.springframework.stereotype.Service;
/**
@@ -29,6 +33,36 @@ import org.springframework.stereotype.Service;
* @date 2019-03-31 16:00:20
*/
@Service
@AllArgsConstructor
public class SysDatasourceConfServiceImpl extends ServiceImpl<SysDatasourceConfMapper, SysDatasourceConf> implements SysDatasourceConfService {
private final DynamicDataSourceConfig dynamicDataSourceConfig;
private final StringEncryptor stringEncryptor;
/**
* 保存数据源并且加密
*
* @param sysDatasourceConf
* @return
*/
@Override
public Boolean saveDsByEnc(SysDatasourceConf sysDatasourceConf) {
sysDatasourceConf.setPassword(stringEncryptor.encrypt(sysDatasourceConf.getPassword()));
this.baseMapper.insert(sysDatasourceConf);
return dynamicDataSourceConfig.reload();
}
/**
* 更新数据源
*
* @param sysDatasourceConf
* @return
*/
@Override
public Boolean updateDsByEnc(SysDatasourceConf sysDatasourceConf) {
if (StrUtil.isNotBlank(sysDatasourceConf.getPassword())) {
sysDatasourceConf.setPassword(stringEncryptor.encrypt(sysDatasourceConf.getPassword()));
}
this.baseMapper.updateById(sysDatasourceConf);
return dynamicDataSourceConfig.reload();
}
}
@@ -0,0 +1,40 @@
package com.pig4cloud.pigx.codegen.util;
/**
* @author lengleng
* @date 2019-04-01
* <p>
* 数据源相关常量
*/
public interface DataSourceConstant {
/**
* 查询数据源的SQL
*/
String QUERY_DS_SQL = "select * from sys_datasource_conf where del_flag = 0";
/**
* 动态路由KEY
*/
String DS_ROUTE_KEY = "id";
/**
* 数据源名称
*/
String DS_NAME = "name";
/**
* jdbcurl
*/
String DS_JDBC_URL = "url";
/**
* 用户名
*/
String DS_USER_NAME = "username";
/**
* 密码
*/
String DS_USER_PWD = "password";
}