1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Druid数据库密码加密 包含单数据源密码加密 多数据源密码加密详细配置

Druid数据库密码加密 包含单数据源密码加密 多数据源密码加密详细配置

时间:2023-12-18 00:54:28

相关推荐

Druid数据库密码加密  包含单数据源密码加密 多数据源密码加密详细配置

发个牢骚

网上虽然有很多相关文章,但是我各种翻看文章依然是各种bug层出不穷,所幸最后终于摸索出了答案,我的第一篇博客应运而生。。

开工

别慌,看到我这篇文章,你的问题就迎刃而解了

一、获取公钥和加密密码

这个网上很好找,基本都是一致的,但是加密肯定也少不了这个环节,我也再多说一遍好了

打开你的maven仓库,找到druid对应的jar包,jar包版本要大于等于1.0.16版本,否则就只会返回一串加密后的密码。

然后在路径上输入cmd打开命令提示符,输入以下命令:

java -cp druid-1.1.9.jar com.alibaba.druid.filter.config.ConfigTools 你的密码 >a.txt

后面加的>a.txt可以在当前目录生成文本文档方便保存,不需要的小伙伴可以去掉。

我这里密码以123456为例,得到的结果如下:

ps:私钥是给密码加密的,我们就不需要了。

二、配置druid解密

上面得到了publickey和password,开始配置。别急,且听我慢慢道来

1、单数据源

配置文件如下:

# 公钥publickey: 你的公钥# 数据库配置spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: 数据库urlusername: 用户名password: 加密后的密文# 启用ConfigFilterfilter:config:enabled: true# 启用解密,配置公钥connection-properties: config.decrypt=true;config.decrypt.key=${publickey}

以上就是单数据源的配置,只需要配置yml,所以我并没有遇到什么bug,顺利成功,有问题的小伙伴我们可以深入交流一下~嘿嘿嘿

2、多数据源

多数据源的话Druid默认没有解密,所以我们需要手动配置解密,这也是我各种踩坑的原因。。。

涉及到的有数据库配置类DbConfig密码回调类DbPasswordCallBack这么两个类需要手写

首先还是配置文件

这里跟单数据源有些不一样,one和two是自定义的名字,需要在DbConfig里的@ConfigurationProperties注解中声明,connection-properties这个属性也是关键,我们一会再说

具体内容如下:

# 数据库配置spring:datasource:one:driver-class-name: com.mysql.cj.jdbc.Driverurl: 数据库urlusername: 用户名password: 加密后的密码publickey: 对应的公钥# 启用ConfigFilterfilter:config:enabled: true# 启用解密,配置公钥和加密后的密码connection-properties: config.decrypt=true;publickey=${spring.datasource.one.publickey};password=${spring.datasource.one.password}two:driver-class-name: com.mysql.cj.jdbc.Driverurl: 数据库urlusername: 用户名password: 加密后的密码publickey: 对应的公钥# 启用ConfigFilterfilter:config:enabled: true# 启用解密,配置公钥和加密后的密码connection-properties: config.decrypt=true;publickey=${spring.datasource.two.publickey};password=${spring.datasource.two.password}

这里提一下踩到的坑,这是困扰我最久的

我们先前有提到DbPasswordCallback这个类,这是我们需要手动配置的密码回调类,也就是用来给密码解密的类,大家应该跟我一样,网上看到的基本都是在配置文件里(yml或者properties)配置的,

就像这样:

然后启动时报错:

***************************APPLICATION FAILED TO START***************************Description:Failed to bind properties under 'spring.datasource.one.password-callback' to javax.security.auth.callback.PasswordCallback:Property: spring.datasource.one.password-callbackValue: com.example.demo.config.DbPasswordCallbackOrigin: class path resource [application.yml]:19:26Reason: No converter found capable of converting from type [java.lang.String] to type [javax.security.auth.callback.PasswordCallback]Action:Update your application's configurationProcess finished with exit code 1

相信大家也都能看明白,大概就是说你配置的password-callback系统只获取到一串字符串,没有转换成它需要的类型,弄了好久实在没办法,我就尝试在DbConfig里面配置,然后就成了。。。泪目

接下来是数据库配置类

DbConfig和Db2Config两个类,代表两个数据源的配置,把这个类复制一遍,把one全局替换成two,再把第二个类的@Primary注解都删掉就OK了,@Primary是标注主数据源的,只能有一个

具体内容如下:

@Configuration//配置Dao所在的包@MapperScan(basePackages = {"com.example.demo.dao.one"},sqlSessionTemplateRef = "oneSqlSessionTemplate")public class DbConfig {@Bean(name = "oneDataSource")//prefix就是你yml文件里的前缀@ConfigurationProperties(prefix = "spring.datasource.one")@Primarypublic DataSource oneDataSource() {DruidDataSource dataSource = new DruidDataSource();//这里是配置密码回调类dataSource.setPasswordCallback(new DbPasswordCallback());return dataSource;}@Bean(name = "oneSqlSessionFactory")@Primarypublic SqlSessionFactory oneSqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));return bean.getObject();}@Bean(name = "oneTransactionManager")@Primarypublic DataSourceTransactionManager oneTransactionManager(@Qualifier("oneDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "oneSqlSessionTemplate")@Primarypublic SqlSessionTemplate oneSqlSessionTemplate(@Qualifier("oneSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}}

然后就是密码回调类了

public class DbPasswordCallback extends DruidPasswordCallback {private static final Logger LOGGER = LoggerFactory.getLogger(DbPasswordCallback.class);@Overridepublic 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("解密失败", e);}}}

这里也是一个小坑

如果你的connection-properties是这样的

connection-properties: config.decrypt=true;config.decrypt.key=${spring.datasource.one.publickey}

那么就会报这样的错误

-03-09 11:28:32.754 ERROR 10968 --- [eate-1390179179] c.e.demo.config.DbPasswordCallback : 解密失败java.lang.NullPointerException: nulljava.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

具体情况我们Debug看一看

很容易看出properties中的属性就是我们connection-properties中的value,并没有对应上,而我在网上四处搜寻的时候,基本都是这么写的,这里要踩一脚CV战士,害人啊!

我在前面给出的代码都是正确的,大家放心用就可以了

下面这是正确操作:

但是这个config.decrypt好像是没有用了,我设置成false一样可以正常解密,懂得大佬指点一下~

以上就是全部内容了,希望能帮到你~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。