出于安全角度,数据库密码不应该明文显示,应该使用密文,在网上找了一圈没找到,没办法只有自己研究,经过一天的研究,找到如下最佳方案,分享给大家


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标签也能做到,这里就不再累述了。
												

快逸报表数据库密码加密解决方案相关推荐

  1. 如何实现Tomcat连接池数据库密码加密

    问题背景: 快逸报表应用在tomcat应用服务器进行部署时,如果需要调用tomcat配置好的数据库连接池,就不得不把报表数据源连接的密码以明文形式暴露,这样数据库连接的用户名密码都非常容易被获取,是非 ...

  2. 快逸报表数据源找不到的一个原因

    快逸报表在设计器中编辑的时候,如果数据集不指定数据源名称,那么设计器会默认用当前数据库来设计报表. 但是,如果报表部署的应用服务器中存在多个数据源的话,所有的报表都会默认的去连接第一个数据源.那么用第 ...

  3. java 多选列表框_快逸报表:填报中的下拉多选列表框

    在快逸报表应用的填报页面中,下拉框是最常见的了.下拉选择框可以简化用户的输入,可以避免用户的错误录入,还可以轻松实现中文与代码的映射关系,可谓用途多多. 可是随着业务的越来越复杂,各种奇怪的需求均可能 ...

  4. 快逸报表API直接生成v4统计图

    客户需求: 之前遇到过客户希望后台直接获取到快逸生成统计图,当时给客户解决的方法是通过先在快逸报表中设置统计图,后台运算后,获取到报表单元格的值,转化成ImageValue对象. 实现准备: 1:了解 ...

  5. SSM项目的数据库密码加密方案

    项目主要采用:SpringMVC4.3.2.RELEASE +Spring4.3.2.RELEASE + Maven 3.3.3 + druid 1.0.29 + Mybatis 3.2.8 + My ...

  6. druid ssh加密 java mysql_springboot 整合druid数据库密码加密功能的实现代码

    在之前给大家介绍过Springboot Druid 自定义加密数据库密码的几种方案,感兴趣的朋友可以点击查看下,今天通过本文给大家介绍springboot 整合druid数据库密码加密功能,具体内容如 ...

  7. druid连接池配置数据库密码加密

    druid配置数据库密码加密后,可以把密码放在配置文件里,或本地其他文件.远程服务器等三种地方,这里只讲第一种方法. 1.密码加密:cd到druid包所在文件夹打开命令行,输入 java -cp dr ...

  8. SpringBoot配置文件敏感信息加密,springboot配置文件数据库密码加密jasypt

    使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysq ...

  9. 使用durid的ConfigFilter对数据库密码加密

    原文连接:http://blog.csdn.net/aixiaoyang168/article/details/49930513 ----------------------------------- ...

  10. mysql数据库druid密码加密_Druid数据库密码加密

    背景 数据库密码直接写在配置中,对安全来说,是一个很大的挑战.Druid为此提供一种数据库密码加密的手段ConfigFilter. druid版本为1.1.18. 加密 1.项目中引入依赖 com.a ...

最新文章

  1. csu1377Putter HOJ12816
  2. java常用弹出式对话框
  3. MySql:从任何主机授予根用户登录权限
  4. Android相关sdk使用
  5. Python数据清理之数据质量
  6. 图解java多线程设计模式 pdf_图解Java设计模式之状态模式
  7. 雷军谈小米10售价:不贵,交个朋友;百度开源首个口罩人脸检测模型;优麒麟18.04.4 LTS发布 | 极客头条...
  8. Codeforces #555 (Div. 3)--C2 Increasing Subsequence (hard version)--投石问路+deque/双指针
  9. LightOJ 1406 Assassin`s Creed
  10. 组合逻辑设计中的毛刺现象
  11. 【报告分享】2021返乡置业报告-贝壳研究院(附下载)
  12. 电脑做照片视频的软件用哪个?3步制作高清照片视频,超多酷炫转场效果
  13. C++之vector的高维数组
  14. Feelings on Life
  15. 2021年5月16日 星期日 阴
  16. cad指北针lisp_用CAD里的LISP画图,题目如图片,编写一程序,可在任意位置任意方向绘制指定大小的指北针。...
  17. stem教育的什么意思
  18. QUAGGA 线程机制解析
  19. 生产故障|Kafka ISR频繁伸缩缩引发性能急剧下降原因分析
  20. rhel8安装libpcap-devel包

热门文章

  1. java发送邮件带附件
  2. microsoft store 安装包_Stata 15软件安装包免费下载附安装教程
  3. 【python高阶编程】python线程池简单应用
  4. Linux中常用命令(初学者必备)
  5. 平面设计论文要如何写?
  6. 什么是NVMe驱动器,您应该购买一个吗?
  7. 2022年软考信息安全工程师备考历年真题汇总
  8. java打字小游戏源码_java实现快速打字游戏
  9. w25qxx SPI读取数据出来为全FF
  10. 计算机算法设计与分析第四版在线,计算机算法设计与分析(第4版) 王晓东习题解答计算机算法设计与分析(第4版) 王晓东习题解答.pdf...