SpringBoot下Druid密码回调配置

使用druid-spring-boot-starter,配置自定义的数据库密码加密回调。
重写com.alibaba.druid.util.DruidPasswordCallbacksetProperties方法。

配置的密码写入密文

特别注意 spring.datasource.druid.password这个属性必须存在,值空或者随便写

# 这个属性必须存在,值空或者随便写
spring.datasource.druid.password=hello


# 自定义加密回调,特别注意,在AesDruidPasswordCallback中,读取这些属性值
spring.datasource.druid.password-callback-class-name=com.bbf.config.AesDruidPasswordCallback
# 在自定义的回调类中,需要读pwd和key的值
spring.datasource.druid.connect-properties.pwd=Icdcxq3YHY56bSgFZOeLHY9eGB75RfReA4EvFFyNxsY=
spring.datasource.druid.connect-properties.key=pXR9pD4KhMGDlmVOQmJDBSJT4iGkXOUso2Fslo2dv3x

解密算法

这里的AesUtil是自己定义的一种加密算法。实际中可以换成其他的算法。

import com.bbf.util.AesUtil;
import com.alibaba.druid.pool.DruidAbstractDataSource;
import com.alibaba.druid.util.DruidPasswordCallback;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 数据库回调密码解密
 * 

在{@link DruidAbstractDataSource#createPhysicalConnection()}调用PasswordCallback方法时, * 会把getConnectProperties()的值放入,也就是spring.datasource.druid.connect-properties。 * 不要与spring.datasource.druid.connection-properties混淆

* * @author BBF */ public class AesDruidPasswordCallback extends DruidPasswordCallback { private static final long serialVersionUID = 8636919602466752407L; private static final Logger LOGGER = LoggerFactory.getLogger(AesDruidPasswordCallback.class); @Override public void setProperties(Properties properties) { super.setProperties(properties); // 从druid的connectProperties中获取自定义的配置信息 String pwd = properties.getProperty("pwd"); String key = properties.getProperty("key"); char[] p = null; try { if (StringUtils.isNoneBlank(pwd, key)) { // 解密密码 String newPassword = AesUtil.cbcDecrypt(pwd, key); p = newPassword.toCharArray(); } } catch (Exception ex) { LOGGER.error("[AesDruidPasswordCallback]解密失败:{}", ex.getMessage(), ex); } super.setPassword(p); } }

密码加密测试类

/**
 * 数据库加密测试类
 *
 * @author BBF
 */
public class AesDruidPasswordCallbackTest {

  private static final String PWD = "htdd";
  private static final String KEY = "pXR9pD4KhMGDlmVOQmJDBSJT4iGkXOUso2Fslo2dv3x";

  @Test
  public void encryptPassword() {
    try {
      String pwd = AesUtil.cbcEncrypt(PWD, KEY);
      System.out.println("预期密文:Icdcxq3YHY56bSgFZOeLHY9eGB75RfReA4EvFFyNxsY=");
      System.out.printf("计算密文:%s\n", pwd);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

你可能感兴趣的:(springboot,druid,java)