快逸报表数据库密码加密解决方案
出于安全角度,数据库密码不应该明文显示,应该使用密文,在网上找了一圈没找到,没办法只有自己研究,经过一天的研究,找到如下最佳方案,分享给大家
1.数据源创建方式选取
在TOMCAT中配置
<Context path="/quiee" docBase="quiee" debug="0" privileged="true"><Resource name="jdbc/report"auth="Container"type="javax.sql.DataSource"maxActive="10"maxIdle="30"maxWait="10000"username="root"password="root" driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://127.0.0.1:3306/report"/> </Context>
如果把passwrod改成密文,则需要改动TOMCAT中连接池的源码,所以不能在这里创建数据源(这里暂且否定该方式)。
第二种就是在reportConfig.xml中配置
<jdbc-ds-configs> <jdbc-ds-config> <name>XXX</name> <db-type>oracle</db-type> <connection-url>jdbc:oracle:thin:@localhost:1521:ORCL</connection-url> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <user-name>scott</user-name> <password>tiger</password> <db-charset>gbk</db-charset> <client-charset>gbk</client-charset> <extend-properties></extend-properties> </jdbc-ds-config> </jdbc-ds-configs>
这种方式是JDBC直连数据库,密码也是明文写在该文件中,但是该配置解析不依赖容器(意思就是我们可以自己去改变取值逻辑),所以我们可以从这里入手去研究。
2.重写servlet实现加密方式
在web.xml中配置:
<servlet> <servlet-name>reportServlet</servlet-name> <servlet-class>com.runqian.util.webutil.SetContextServlet</servlet-class> <init-param> <param-name>configFile</param-name> <param-value>/WEB-INF/reportConfig/reportConfig.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
我们就从SetContextServlet入手,在读取到该servlet进行初始化的时候会去加载reportConfig.xml文件,简单的跟下源码:
public void init() throws ServletException{
super.init();
String designerFlag = ...
...
Context dcc = new DesignerConfigContext();
Context.setInitCtx(dcc);
...
}
这里面确实是去创建了Context。好了,到这里基本就知道了要干啥了,对的,新建子类,重写init() 方法!
public class KybbSetContextServlet extends SetContextServlet{ private static final Logger logger = LoggerFactory.getLogger(KybbSetContextServlet.class); public void init() throws ServletException{ //调用父类初始化方法 super.init(); //获取上下文 Context tx =Context.getInitCtx(); if(tx != null){ //该factory里包含了快逸报表所有的数据源 Map factory = tx.getConnectionFactoryMap(true); if(factory != null){ DataSource ds = factory.get("XXX") != null? (DataSource)factory.get("XXX"):null; if(ds == null){ throw new IllegalArgumentException("无法获取快逸报表对应的数据源[XXX]配置!"); } String public_key = SpringPropertyResourceReader.getProperty("jdbc.crypt.key"); String user = SpringPropertyResourceReader.getProperty("jdbc.username"); String password = SpringPropertyResourceReader.getProperty("jdbc.password"); //解密 此处捕获异常即可,不可能触发 try { password = ConfigTools.decrypt(public_key, password); } catch (Exception e) { logger.error(e.getMessage(),e); } //快逸报表加密,在创建连接时,会对数据源中的密码进行PwdUtils解密 password = PwdUtils.encrypt(password); //设置账号密码 ds.setUser(user); ds.setPassword(password); //新建配置 DataSourceConfig sourceConfig = new DataSourceConfig(DBTypes.ORACLE, false, "utf-8", "utf-8", false); // 设置默认数据源 tx.setDefDataSourceName("XXX"); tx.setDataSourceConfig("XXX", sourceConfig); // 设数据库连接工厂 IConnectionFactory connectionFactory = tx.getConnectionFactory(tx.getDefDataSourceName()); tx.setConnectionFactory("XXX", connectionFactory); } } } }
对以上代码做几点必要的说明:
1.super.init(), 调用父类的init()方法,目的是加载Context,init方法会对reportConfig.xml进行解析。
2.Context tx = Context.getInitCtx(),获取上下文,tx中有我们设置过的数据源<jdbc-ds-configs>。
3.XXX表示我们定义的数据源名称:<jdbc-ds-configs><name>XXX</name>
4.账号,密码,秘钥都从配置文件中读取,这里读取的密码是加密之后的。
5.ConfigTools是对配置文件中获取到的密码进行解密,得到的是明文;PWDUtils是再次对明文进行加密,因为在创建数据看链接的时候会对密码进行解密,加密方式为PWDUtils.enecrypt,有兴趣的同学可以跟跟源码~
再将servlet-class替换成我们写的子类就OK啦。
<servlet> <servlet-name>reportServlet</servlet-name> <!-- <servlet-class>com.runqian.util.webutil.SetContextServlet</servlet-class> --> <servlet-class>xxx.xxx.xxx.servlet.KybbSetContextServlet</servlet-class> <init-param> <param-name>configFile</param-name> <param-value>/WEB-INF/reportConfig/reportConfig.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
当然,我们的jdbc-ds-config中的配置<user-name></user-name><password></password>随便填什么都无所谓了。
因为我们的账号密码都在XXX.properties中维护了。
既然账号密码可以不填写,那么我们之前说的第一种,通过TOMCAT中 resource标签也能做到,这里就不再累述了。
快逸报表数据库密码加密解决方案相关推荐
- 如何实现Tomcat连接池数据库密码加密
问题背景: 快逸报表应用在tomcat应用服务器进行部署时,如果需要调用tomcat配置好的数据库连接池,就不得不把报表数据源连接的密码以明文形式暴露,这样数据库连接的用户名密码都非常容易被获取,是非 ...
- 快逸报表数据源找不到的一个原因
快逸报表在设计器中编辑的时候,如果数据集不指定数据源名称,那么设计器会默认用当前数据库来设计报表. 但是,如果报表部署的应用服务器中存在多个数据源的话,所有的报表都会默认的去连接第一个数据源.那么用第 ...
- java 多选列表框_快逸报表:填报中的下拉多选列表框
在快逸报表应用的填报页面中,下拉框是最常见的了.下拉选择框可以简化用户的输入,可以避免用户的错误录入,还可以轻松实现中文与代码的映射关系,可谓用途多多. 可是随着业务的越来越复杂,各种奇怪的需求均可能 ...
- 快逸报表API直接生成v4统计图
客户需求: 之前遇到过客户希望后台直接获取到快逸生成统计图,当时给客户解决的方法是通过先在快逸报表中设置统计图,后台运算后,获取到报表单元格的值,转化成ImageValue对象. 实现准备: 1:了解 ...
- SSM项目的数据库密码加密方案
项目主要采用:SpringMVC4.3.2.RELEASE +Spring4.3.2.RELEASE + Maven 3.3.3 + druid 1.0.29 + Mybatis 3.2.8 + My ...
- druid ssh加密 java mysql_springboot 整合druid数据库密码加密功能的实现代码
在之前给大家介绍过Springboot Druid 自定义加密数据库密码的几种方案,感兴趣的朋友可以点击查看下,今天通过本文给大家介绍springboot 整合druid数据库密码加密功能,具体内容如 ...
- druid连接池配置数据库密码加密
druid配置数据库密码加密后,可以把密码放在配置文件里,或本地其他文件.远程服务器等三种地方,这里只讲第一种方法. 1.密码加密:cd到druid包所在文件夹打开命令行,输入 java -cp dr ...
- SpringBoot配置文件敏感信息加密,springboot配置文件数据库密码加密jasypt
使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysq ...
- 使用durid的ConfigFilter对数据库密码加密
原文连接:http://blog.csdn.net/aixiaoyang168/article/details/49930513 ----------------------------------- ...
- mysql数据库druid密码加密_Druid数据库密码加密
背景 数据库密码直接写在配置中,对安全来说,是一个很大的挑战.Druid为此提供一种数据库密码加密的手段ConfigFilter. druid版本为1.1.18. 加密 1.项目中引入依赖 com.a ...
最新文章
- csu1377Putter HOJ12816
- java常用弹出式对话框
- MySql:从任何主机授予根用户登录权限
- Android相关sdk使用
- Python数据清理之数据质量
- 图解java多线程设计模式 pdf_图解Java设计模式之状态模式
- 雷军谈小米10售价:不贵,交个朋友;百度开源首个口罩人脸检测模型;优麒麟18.04.4 LTS发布 | 极客头条...
- Codeforces #555 (Div. 3)--C2 Increasing Subsequence (hard version)--投石问路+deque/双指针
- LightOJ 1406 Assassin`s Creed
- 组合逻辑设计中的毛刺现象
- 【报告分享】2021返乡置业报告-贝壳研究院(附下载)
- 电脑做照片视频的软件用哪个?3步制作高清照片视频,超多酷炫转场效果
- C++之vector的高维数组
- Feelings on Life
- 2021年5月16日 星期日 阴
- cad指北针lisp_用CAD里的LISP画图,题目如图片,编写一程序,可在任意位置任意方向绘制指定大小的指北针。...
- stem教育的什么意思
- QUAGGA 线程机制解析
- 生产故障|Kafka ISR频繁伸缩缩引发性能急剧下降原因分析
- rhel8安装libpcap-devel包
热门文章
- java发送邮件带附件
- microsoft store 安装包_Stata 15软件安装包免费下载附安装教程
- 【python高阶编程】python线程池简单应用
- Linux中常用命令(初学者必备)
- 平面设计论文要如何写?
- 什么是NVMe驱动器,您应该购买一个吗?
- 2022年软考信息安全工程师备考历年真题汇总
- java打字小游戏源码_java实现快速打字游戏
- w25qxx SPI读取数据出来为全FF
- 计算机算法设计与分析第四版在线,计算机算法设计与分析(第4版) 王晓东习题解答计算机算法设计与分析(第4版) 王晓东习题解答.pdf...