zoukankan      html  css  js  c++  java
  • 使用Druid数据库连接池,配置ConfigFilter对数据库密码加密

    ConfigFilter的作用包括:

    • 从配置文件中读取配置
    • 从远程http文件中读取配置
    • 为数据库密码提供加密功能

    1.配置 ConfigFilter

    1.1配置文件从本地文件系统中读取

    1.  
      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
    2.  
      init-method="init" destroy-method="close">
    3.  
      <property name="filters" value="config" />
    4.  
      <property name="connectionProperties" value="config.file=file:///home/admin/druid-pool.properties" />
    5.  
      </bean>

    1.2配置文件从远程http服务器中读取

    1.  
      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
    2.  
      init-method="init" destroy-method="close">
    3.  
      <property name="filters" value="config" />
    4.  
      <property name="connectionProperties" value="config.file=http://127.0.0.1/druid-pool.properties" />
    5.  
      </bean>

    这种配置方式,使得一个应用集群中,多个实例可以从同一个地方读取配置,集中配置,集中修改,部署更简单。

    1.3通过jvm启动参数来使用ConfigFilter

    DruidDataSource支持jvm启动参数配置filters,所以你可以:

    java -Ddruid.filters=config ....

    2数据库密码加密

    数据库密码直接写在配置中,对运维安全来说,是一个很大的挑战。Druid为此提供一种数据库密码加密的手段ConfigFilter。

    2.1执行命令加密数据库密码

    在命令行中执行如下命令:

    java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools you_password

    输出

    1.  
      privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
    2.  
      publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
    3.  
      password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==

    输入你的数据库密码,输出的是加密后的结果。

    2.2配置数据源,提示Druid数据源需要对数据库密码进行解密。

    1.  
      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
    2.  
      init-method="init" destroy-method="close">
    3.  
      <property name="url" value="jdbc:derby:memory:spring-test;create=true" />
    4.  
      <property name="username" value="sa" />
    5.  
      <property name="password" value="${password}" />
    6.  
      <property name="filters" value="config" />
    7.  
      <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${publickey}" />
    8.  
      </bean>

    2.3配置参数,让ConfigFilter解密密码

    有三种方式配置:

    1. 可以在配置文件my.properties中指定config.decrypt=true 
    2. 也可以在DruidDataSource的ConnectionProperties中指定config.decrypt=true 
    3. 也可以在jvm启动参数中指定-Ddruid.config.decrypt=true 

    以下示例是我在开发项目中用Druid数据库连接池所写:

    1.  
      @Bean
    2.  
      protected DataSource dataSource() {
    3.  
      DruidDataSource dataSource = new DruidDataSource();
    4.  
      try {
    5.  
      // 1.
    6.  
      // dataSource.setFilters("config");
    7.  
      // String connectionProperties =
    8.  
      // "config.file=classpath:mysql_db.prorerties";
    9.  
      // dataSource.setConnectionProperties(connectionProperties);
    10.  
      // 2。使用Druid数据源
    11.  
      try {
    12.  
      Properties properties = new Properties();
    13.  
      InputStream inStream = getClass().getResourceAsStream("/mysql_db.prorerties");
    14.  
      properties.load(inStream);
    15.  
      dataSource.setFilters("config");
    16.  
      dataSource.setUsername(properties.getProperty("username"));
    17.  
      dataSource.setPassword(properties.getProperty("password"));
    18.  
      dataSource.setDriverClassName(properties.getProperty("driverClassName"));
    19.  
      dataSource.setUrl(properties.getProperty("url"));
    20.  
      String publickey = properties.getProperty("publickey");
    21.  
      String connectionProperties = "config.decrypt=true;config.decrypt.key=" + publickey;
    22.  
      dataSource.setConnectionProperties(connectionProperties);
    23.  
      } catch (IOException e) {
    24.  
      e.printStackTrace();
    25.  
      }
    26.  
      } catch (SQLException e) {
    27.  
      e.printStackTrace();
    28.  
      }
    29.  
      return dataSource;
    30.  
      }
    1.  
      #2Druid数据源
    2.  
      publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDHoaPpziat/FYuWot6kJh5Hyz9DnOzOhxJImXgsHr/OVYGCRTlOuj8m5fLs9kS0hjn46lvsCXOn5+y2/TrPB0CAwEAAQ==
    3.  
      username=root
    4.  
      password=jvagl79+aZg6U6448zsZnRrHgVorbjoL5MEQ6c2r9R2K+H4Wnpix9z5m9Ig1yvFp/6HqB+vGr5xRLC8HDYe2Ag==
    5.  
      driverClassName=com.mysql.jdbc.Driver
    6.  
      url=jdbc:mysql://127.0.0.1:3306/demo

    当出现以下异常时:

    org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.lang.IllegalArgumentException: Failed to decrypt.

    请仔细检查加密后的密码、publickey是否是命令行中输出的相同。

  • 相关阅读:
    Ubuntu 16 安装redis客户端
    crontab 参数详解
    PHP模拟登录发送闪存
    Nginx配置端口访问的网站
    Linux 增加对外开放的端口
    Linux 实用指令之查看端口开启情况
    无敌的极路由
    不同的域名可以指向同一个项目
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
    Redis 创建多个端口
  • 原文地址:https://www.cnblogs.com/javalinux/p/15214833.html
Copyright © 2011-2022 走看看