当前位置:   article > 正文

Spring boot+Druid+多数据源 +密码加密_spring多数据源配置的时候数据库可以使用加密密码吗

spring多数据源配置的时候数据库可以使用加密密码吗

1、添加MAVEN依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

2、配置文件:

server:
  port: 8090
  
spring:
  application:
    name: DataSourceTest
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      one:
        url: jdbc:mysql://localhost:3306/sourcetest?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8&useSSL=false
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
        db-type: mysql
        initial-size: 5
        max-active: 500
        min-idle: 5
        max-wait: 60000
        max-pool-prepared-statement-per-connection-size: 50
        max-open-prepared-statements: 50
        validation-query: SELECT 1 FROM DUAL
        test-on-borrow: false
        test-on-return: false
        test-while-idle: true
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        filters: stat,wall,slf4j
      two:
        url: jdbc:mysql://localhost:3306/sourcetest1?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8&useSSL=false
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
        db-type: mysql
        initial-size: 5
        max-active: 500
        min-idle: 5
        max-wait: 60000
        max-pool-prepared-statement-per-connection-size: 50
        max-open-prepared-statements: 50
        validation-query: SELECT 1 FROM DUAL
        test-on-borrow: false
        test-on-return: false
        test-while-idle: true
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        filters: stat,wall,slf4j

             


             

3、数据源连接类

  1. import javax.sql.DataSource;
  2. import org.springframework.beans.factory.annotation.Qualifier;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.context.annotation.Primary;
  7. import org.springframework.jdbc.core.JdbcTemplate;
  8. import com.alibaba.druid.pool.DruidDataSource;
  9. @Configuration
  10. public class DataSourceConfig {
  11. @Bean(name = "dataSource")
  12. @ConfigurationProperties(prefix = "spring.datasource.druid.one")
  13. @Primary //设置主数据源
  14. public DataSource dataSource(){
  15. return new DruidDataSource();
  16. }
  17. @Bean(name = "dataSourceTwo")
  18. @ConfigurationProperties(prefix = "spring.datasource.druid.two")
  19. public DataSource DataSourceOne(){
  20. return new DruidDataSource();
  21. }
  22. @Bean(name = "jdbcTemplate")
  23. public JdbcTemplate jdbcTemplate(@Qualifier("dataSource") DataSource dataSource){
  24. return new JdbcTemplate(dataSource);
  25. }
  26. @Bean(name = "jdbcTemplate2")
  27. public JdbcTemplate jdbcTemplate2(@Qualifier("dataSourceTwo") DataSource dataSource){
  28. return new JdbcTemplate(dataSource);
  29. }
  30. }

4、DAO使用方式:

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.beans.factory.annotation.Qualifier;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public class Dao {
  7. @Autowired
  8. @Qualifier("jdbcTemplate")
  9. JdbcTemplate jdbcTemplate;
  10. @Autowired
  11. @Qualifier("jdbcTemplate2")
  12. JdbcTemplate jdbcTemplate1;
  13. public String getUserName(String ID){
  14. String sql = "select name from test where id = ?";
  15. return jdbcTemplate.queryForObject(sql, String.class, new Object[]{ID});
  16. }
  17. public String getUserName1(String ID){
  18. String sql = "select name from test where id = ?";
  19. return jdbcTemplate1.queryForObject(sql, String.class, new Object[]{ID});
  20. }
  21. }

以上就是Druid+多数据源+JDBC使用方式,在实际项目中,有很多同学在生产环境需要加密数据库密码,那么就需要做一点小改动了:

1、首先通过Druid自带的加密方式加密密码:

     一、进入Druid jar包所在文件夹路径,通过命令加密:

加密命令为:

java -cp druid-1.1.17.jar com.alibaba.druid.filter.config.ConfigTools  password

将password替换为你的数据库密码即可。

结果如图:

  其中password为加密后的字符串,privateKey为私钥,publicKey为公钥。

  二、 修改配置文件:

 将配置文件中密码替换为加密后的字符串,并将公钥添加进去,添加密码回调类,修改后的完整配置文件为:

  1. server:
  2. port: 8090
  3. spring:
  4. application:
  5. name: DataSourceTest
  6. datasource:
  7. type: com.alibaba.druid.pool.DruidDataSource
  8. publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALI4Yfqx/ihVlW0FsmwC1I1sc9t/5OV2ge4YdKF+ZmDnpk0c8JglEdwdx+1/qNHg4MP5Kvgu26LOt0E1zR6PQS0CAwEAAQ==
  9. druid:
  10. one:
  11. url: jdbc:mysql://localhost:3306/sourcetest?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8&useSSL=false
  12. username: root
  13. password: ktwLokn7m57F7WNotRjJkYDYatGdP485mPe8iIAaK2k3cgMMbK5twzDxyCYBEGEs6v2+YE+r0qwunCUdl9bEfw==
  14. driver-class-name: com.mysql.cj.jdbc.Driver
  15. db-type: mysql
  16. initial-size: 5
  17. max-active: 500
  18. min-idle: 5
  19. max-wait: 60000
  20. max-pool-prepared-statement-per-connection-size: 50
  21. max-open-prepared-statements: 50
  22. validation-query: SELECT 1 FROM DUAL
  23. test-on-borrow: false
  24. test-on-return: false
  25. test-while-idle: true
  26. time-between-eviction-runs-millis: 60000
  27. min-evictable-idle-time-millis: 300000
  28. filters: stat,wall,slf4j
  29. passwordCallbackClassName: com.yanqi.utils.DbPasswordCallback
  30. connection-properties: config.decrypt=true;publicKey=${spring.datasource.publicKey};password=${spring.datasource.druid.one.password}
  31. filter:
  32. config:
  33. enabled: true
  34. two:
  35. url: jdbc:mysql://localhost:3306/sourcetest1?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8&useSSL=false
  36. username: root
  37. password: ktwLokn7m57F7WNotRjJkYDYatGdP485mPe8iIAaK2k3cgMMbK5twzDxyCYBEGEs6v2+YE+r0qwunCUdl9bEfw==
  38. driver-class-name: com.mysql.cj.jdbc.Driver
  39. db-type: mysql
  40. initial-size: 5
  41. max-active: 500
  42. min-idle: 5
  43. max-wait: 60000
  44. max-pool-prepared-statement-per-connection-size: 50
  45. max-open-prepared-statements: 50
  46. validation-query: SELECT 1 FROM DUAL
  47. test-on-borrow: false
  48. test-on-return: false
  49. test-while-idle: true
  50. time-between-eviction-runs-millis: 60000
  51. min-evictable-idle-time-millis: 300000
  52. filters: stat,wall,slf4j
  53. passwordCallbackClassName: com.yanqi.utils.DbPasswordCallback
  54. connection-properties: config.decrypt=true;publicKey=${spring.datasource.publicKey};password=${spring.datasource.druid.two.password}
  55. filter:
  56. config:
  57. enabled: true

其中passwordCallbackClassName为密码回调类,需要自己手动实现密码解密:

  1. import java.util.Properties;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import com.alibaba.druid.filter.config.ConfigTools;
  5. import com.alibaba.druid.util.DruidPasswordCallback;
  6. /**
  7. * Druid多数据源 密码回调
  8. * @author yanqi
  9. * @Date 2019年9月18日
  10. */
  11. public class DbPasswordCallback extends DruidPasswordCallback{
  12. private static final Logger logger = LoggerFactory.getLogger(DbPasswordCallback.class);
  13. @Override
  14. public void setProperties(Properties properties){
  15. super.setProperties(properties);
  16. //获取application.yml 里面配置的密码和公钥
  17. String password = (String) properties.get("password");
  18. String publickey = (String) properties.get("publicKey");
  19. try {
  20. String dbpassword = ConfigTools.decrypt(publickey, password);
  21. setPassword(dbpassword.toCharArray());
  22. } catch (Exception e) {
  23. logger.error("Druid ConfigTools.decrypt", e);
  24. }
  25. }
  26. }

以上就是整个数据源配置加实现方式,附上demo,有问题的小伙伴可以私信交流~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/844135
推荐阅读
相关标签
  

闽ICP备14008679号