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

Druid连接池自定义数据库密码加解密怎么实现,第1张

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

?

1

2

3

<property name="passwordCallback" >

<bean class="utils.DBPasswordCallback" />

</property>

DBPasswordCallback类实现:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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

单车架构师

发帖于 2年前

3回/634阅

标签: Druid

举报

| 分享到

0收藏(1)

按票数排序 显示最新答案 共有3个答案 (最后回答: 2年前 )

0

单车架构师2年前

有人知道吗?

评论(0)| 引用此答案| 举报 (2014-02-22 12:57)

0

兮风古道2年前

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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

}

}

}

评论(0)| 引用此答案| 举报 (2014-02-22 13:37)

0

单车架构师2年前

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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

}

}

}

Java单体项目里,我们一般是只需配置一个数据库,这时代码里的dao层都是只对一个数据库 *** 作;但有时候我们的数据可能在2个或者3个数据库,这时就需要配置更多数据源,进行数据库直连 *** 作,下面以MySQL的两个库为例(Oracle也就换个驱动类与连接串)。

(本文阅读大概花费两分钟)

技术条件:

springboot 2.5.3 (即springframework 5.3.9)

MySQL 5.7

mybatis-plus 3.5.0

dynamic-datasource 3.5.0

druid 1.2.9

idea开发工具、maven 3.3.9

1、导入相关依赖

2、建立两个数据库mydb(表 user)、db2(表t_class),并分别建一张表

3、编写application.yaml配置文件

4、编写po类、dao层、一个接口测试类

其中,在dao的类加上对应的数据源标识符,使用此注解com.baomidou.dynamic.datasource.annotation.DS

5、启动项目,查看结果

至此,多数据源环境集成成功;当然这里只使用了查询功能,对应事务相关的下一回合文章再做讨论啥。

现针对数据库密码加密方面,利用druid进行数据库加密,实现项目配置文件中数据库密码密文存储,一定程度上保证了数据安全。

配置方法:

1、数据源配置[spring-mybatis.xml文件]

<!-- 配置数据源 -->

<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"

init-method="init" destroy-method="close">

<property name="driverClassName" value="${jdbc.driver}" />

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

<!-- 配置初始化大小、最小、最大 -->

<property name="initialSize" value="${jdbc.pool.init}" />

<property name="minIdle" value="${jdbc.pool.minIdle}" />

<property name="maxActive" value="${jdbc.pool.maxActive}" />

<!-- 配置获取连接等待超时的时间 -->

<property name="maxWait" value="60000" />

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->

<property name="timeBetweenEvictionRunsMillis" value="60000" />

<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->

<property name="minEvictableIdleTimeMillis" value="300000" />

<property name="validationQuery" value="${jdbc.validation.query}" />

<property name="testWhileIdle" value="true" />

<property name="testOnBorrow" value="false" />

<property name="testOnReturn" value="false" />

<!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)

<property name="poolPreparedStatements" value="true" />

<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />-->

<!-- 配置监控统计拦截的filters -->

<!--<property name="filters" value="stat" />-->

<property name="filters" value="${jdbc.filters}" />

<property name="connectionProperties"

value="${jdbc.connectionProperties}"/>

</bean>


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10822501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存