开发者社区 问答 正文

Druid连接池自定义数据库密码加解密怎么实现?:报错

@wenshao 你好,想跟你请教个问题:我实现一个DruidPasswordCallback子类,并配置到dataSource的property中:

<property name="passwordCallback" >
    <bean class="utils.DBPasswordCallback" />
</property>
DBPasswordCallback类实现:
public class DBPasswordCallback extends DruidPasswordCallback {

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 1L;

    @Override
    public void setProperties(Properties properties)
    {
        super.setProperties(properties);
        String pwd = properties.getProperty("password");
        if (!StringUtil.isTrimEmpty(pwd)) {
            try {
                setPassword(EncryptUtil.decrypt2AES(pwd).toCharArray());
            } catch (Exception e) {
                setPassword(pwd.toCharArray());
            }
        }
    }
}

可是无法解密。 调试时发现properties是空的({}),取不到jdbc配置的原始密码,所以后面的操作也就没有意义了。 大家知道正确的做法吗?

Druid版本1.0.2

展开
收起
kun坤 2020-06-06 11:36:50 1455 分享 版权
1 条回答
写回答
取消 提交回答
  • 有人知道吗?######

    可以扩展Spring的PropertyPlaceholderConfigurer,摘录别人一段代码你参考

    public class DecryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{
        /**
         * 重写父类方法,解密指定属性名对应的属性值
         */
    	@Override
    	protected String convertProperty(String propertyName,String propertyValue){
    		if(isEncryptPropertyVal(propertyName)){
    			return DesUtils.getDecryptString(propertyValue);//调用解密方法
    		}else{
    			return propertyValue;
    		}
    	}
    	/**
    	 * 判断属性值是否需要解密,这里我约定需要解密的属性名用encrypt开头
    	 * @param propertyName
    	 * @return
    	 */
    	private boolean isEncryptPropertyVal(String propertyName){
    		if(propertyName.startsWith("encrypt")){
    			return true;
    		}else{
    			return false;
    		}
    	}
    }






    ######

    引用来自“兮风古道”的答案

    可以扩展Spring的PropertyPlaceholderConfigurer,摘录别人一段代码你参考

    public class DecryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{
        /**
         * 重写父类方法,解密指定属性名对应的属性值
         */
    	@Override
    	protected String convertProperty(String propertyName,String propertyValue){
    		if(isEncryptPropertyVal(propertyName)){
    			return DesUtils.getDecryptString(propertyValue);//调用解密方法
    		}else{
    			return propertyValue;
    		}
    	}
    	/**
    	 * 判断属性值是否需要解密,这里我约定需要解密的属性名用encrypt开头
    	 * @param propertyName
    	 * @return
    	 */
    	private boolean isEncryptPropertyVal(String propertyName){
    		if(propertyName.startsWith("encrypt")){
    			return true;
    		}else{
    			return false;
    		}
    	}
    }






    不是一回事啊!
    ######回复 @兮风古道 : 嗯,我也明白你的意思。######我想说的是: 你要做数据源密码加密解密,只要扩展spring那一套就可以,而且是跟连接池无关的,不需要非得用druid内置的。
    2020-06-06 11:36:56
    赞同 展开评论