赞
踩
一、问题描述
springboot集成druid配置多数据源情况下,数据库密码加密访问时会出现连接异常问题,具体报错如下:
二、问题分析
如果是单数据源的话druid是自带解密的,但是多数据源的情况下druid不会使用默认的加载方法,多数据源还是需要手动解密的。
通过断点调试,发现步骤三中的解决方案是靠谱有效,关键断点截图如下:
由此可分析自定义DruidPasswordCallback类密码解密后可实现重写password。
三、解决方案
Druid可以配置一个叫做passwordCallBack的参数,这个参数的值是一个全限定类名,这个类需要继承DruidPasswordCallback.java类,实现一个setProperties()方法,在这个方法里,可以将加密的密码通过Druid提供的ConfigTools.decrypt(publickey, password)方法进行解密,再通过DruidPasswordCallback.java类的父类PasswordCallback.java的setPassword()的方法赋值解密后的密码,再看上面图中1545行代码,password获得的值就是解密后的密码,请求连接数据库就没问题了。
四、关键解决步骤
1、自定义类继承DruidPasswordCallback.java
package com.aas.system.config; import com.alibaba.druid.filter.config.ConfigTools; import com.alibaba.druid.util.DruidPasswordCallback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Properties; /** * @author Jordon.Yu * @version V1.0 * @description:密码回调类 * @date 2019/6/18 17:35 */ public class DbPasswordCallback extends DruidPasswordCallback { private static final Logger LOGGER = LoggerFactory.getLogger(DbPasswordCallback.class); /** * @param properties 属性值列表 * @return * @description:处理解密 * @author Jordon.Yu * @date 2019/6/22 18:32 */ @Override public void setProperties(Properties properties) { super.setProperties(properties); String password = (String) properties.get("password"); String publickey = (String) properties.get("publickey"); try { String dbpassword = ConfigTools.decrypt(publickey, password); setPassword(dbpassword.toCharArray()); } catch (Exception e) { LOGGER.error("Druid ConfigTools.decrypt", e); } } }
2、配置相关属性
3、数据源中注入步骤2中属性,以及配置相关参数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。