Springboot简单功能示例-6 使用加密数据源并配置日志
springboot-sample
介绍
软件架构(当前发行版使用)
- springboot
- hutool-all 非常好的常用java工具库 官网 maven
- bcprov-jdk18on 一些加密算法的实现 官网 maven
- h2 纯java的数据库,支持内存、文件、网络数据库 官网 maven
安装教程
git clone --branch 6.使用加密数据源并配置日志 git@gitee.com:simen_net/springboot-sample.git
功能说明
- 配置logback
- 配置了数据源,对数据库账号密码进行加密
- 增加了系统启动配置
发行版说明
- 完成基本WEB服务 跳转到发行版
- 完成了KEY初始化功能和全局错误处理 跳转到发行版
- 完成了基本登录验证 跳转到发行版
- 完成了自定义加密进行登录验证 跳转到发行版
- 完成了使用JWT进行授权认证 跳转到发行版
- 完成了使用加密数据源并配置日志 跳转到发行版 查看发行版说明
使用加密数据源并配置日志
配置logback
配置logback.xml,规范日志输出格式,配置info和error日志输出为文件(保存30天)
配置数据源
-
在application-dev.yaml中配置数据源
# spring基本配置 spring: # 数据库连接池配置 datasource: driver-class-name: org.h2.Driver # 使用H2数据库,此处不配置url,在com.strong.config.DataSourceConfig中配置本地目录数据库 # url: jdbc:h2:mem:simen # url: jdbc:h2:./simen username: BKkV4rITSiMsMBEZtIoNeLivkfJYjRNPJjX0EJ21hxMQ/oflQL5Qk3u8B7RhqfD+KIkOkPHDSNx3c67q78lTwLqTOCuYkltDI2R9kES3d4yXb+bFxtXAm9qs7m+EMLX85MRX password: BDNZEUz2C0XDhU0y3OtKUCVkoLKVlTo5EXEIhBtKHwAGT5heBYyKkkd0I5J8A1PBRGkczhA86MqI2SQTXXuJ+b+ki4jqhlNhELG+ts6T/VZugd6pKs5bbqcSDWqT5s0XEpbgJ1Ah7aE56AbazjVaBX5U3FsEU/KhWHQ3qx0KoN47 # 连接池类型 type: com.alibaba.druid.pool.DruidDataSource # 参数配置 druid: # 初始化时建立物理连接的个数 initialSize: 5 # 最小连接池数量 minIdle: 20 # 最大连接池数量 maxActive: 50 # 获取连接时最大等待时间,单位:毫秒 maxWait: 60000 # 是否缓存PSCache,PSCache对支持游标的数据库性能提升巨大 poolPreparedStatements: true # 启用PSCache,必须配置大于0 maxPoolPreparedStatementPerConnectionSize: 20 # 用来检测连接是否有效的sql validationQuery: select 1 # 检测连接是否有效的超时时间,单位:秒 validationQueryTimeout: 5 # 申请连接时执行validationQuery检测连接是否有效,会降低性能 testOnBorrow: false # 归还连接时执行validationQuery检测连接是否有效,会降低性能 testOnReturn: false # 申请连接的时候检测连接是否有效 testWhileIdle: true # 空闲时间超过minEvictableIdleTimeMillis,是否强制keepAlive keepAlive: false # 空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 连接保持空闲而不被驱逐的最小时间,单位毫秒 minEvictableIdleTimeMillis: 30000 # 物理连接初始化的时候执行的sql。 connectionInitSqls: select 0 # 常用的插件有:监控统计用的filter:stat、日志用的filter:log4j、防御sql注入的filter:wall filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: |- druid.stat.mergeSql=false; druid.stat.slowSqlMillis=5000
-
增加数据库配置DataSourceConfig,对账号密码进行加密,解决项目源码提交到公共git造成账号密码泄露的问题。
/** * 从默认参数配置数据源 * * @return {@link DataSource} */ @Bean @ConfigurationProperties(prefix = "spring.datasource.druid") public DataSource getDataSource() { DruidDataSource druidDataSource = DruidDataSourceBuilder.create().build(); // 如果是H2数据库,则注入加载 if (StrUtil.equals(org.h2.Driver.class.getName(), driverClassName)) { // 配置数据库URL String strJdbcUrl = "jdbc:h2:tcp://localhost:9092/" + StrongUtils.getStaticPath(STR_DIRECTORY_STATICS, databaseName); druidDataSource.setUrl(strJdbcUrl); log.info("成功连接H2数据库[{}]", strJdbcUrl); } // 使用私钥解密账号密码,注入数据源 druidDataSource.setUsername(SM2_OBJ.decryptStr(username, KeyType.PrivateKey)); druidDataSource.setPassword(SM2_OBJ.decryptStr(password, KeyType.PrivateKey)); return druidDataSource; }
- 使用DruidDataSource从application-dev.yaml中加载数据源配置参数
DruidDataSource druidDataSource = DruidDataSourceBuilder.create().build();
- 在使用H2数据库时,使用项目名为数据库名,数据库文件保存在当前项目所在目录中的
static
中 - 从application-dev.yaml中读取加密后的数据库账号密码,使用私钥解密后注入数据源
- 使用DruidDataSource从application-dev.yaml中加载数据源配置参数
系统启动配置
- 在SpringbootSampleApplication.java中配置启动
public static void main(String[] args) { // 测试加解密、签名字符串 SecurityUtils.testPasswordEncode(); // 生成数据密码加密后字符串 String strDatabaseUsername = "sa"; String strDatabasePassword = "123456"; log.info("\n使用公钥加密数据库账号密码,需将加密字符串配置到application.yaml\n数据库用户名[{}] 加密后[{}]\n密码[{}] 加密后[{}]\n", strDatabaseUsername, SM2_OBJ.encryptBase64(strDatabaseUsername, KeyType.PublicKey), strDatabasePassword, SM2_OBJ.encryptBase64(strDatabasePassword, KeyType.PublicKey) ); // 启动H2服务器 H2Utils.startH2Server(); // 设置当前时区 TimeZone.setDefault(TimeZone.getTimeZone(STR_TIME_ZONE_ASIA_SHANGHAI)); // 获取系统对象 SpringApplication application = new SpringApplication(SpringbootSampleApplication.class); // 系统pid记录文件 String strPidFile = StrongUtils.getStaticPath(STR_FILE_APP_PID); // 将pid监听信息写入记录文件,使用 cat /xxxx/app.id | xargs kill 停止服务 application.addListeners(new ApplicationPidFileWriter(strPidFile)); log.info("将pid监听信息写入记录文件{}", strPidFile); // 启动系统 application.run(); }