有时候遇到比较老的产品,公司的产品组也不提供维护了,更可恨的是,源代码也不给。在这种情况,遇到有bug,怎么办呢?
我们项目组一直在维护着一个2013年基于公司老产品开发的项目,既然是产品,公司产品弄死不肯定提供老产品的代码,原因大概是因为代码管理混乱,已经找不到我们项目的代码了。
这个bug出现在数据授权的时候,按常规组织授权后,下级用户居然能看到上级用户数据,我们的数据授权原理是:获取授权用户所在层级,并获取当前的授权组织表,将组织表数据和当前用户进行匹配,并记录在授权表,然后,用户在查询数据的时候就读取授权表拼接in语句去数据库查询。当出现这个问题的时候,显然是不允许的,这时候,我们的检查步骤是:
1、检查用户组织表
2、检查授权表
3、检查最终执行sql语句
通过以上步骤,最终发现是在做sql拼接成in的条件的时候出现的问题,这时候,就只有进入到代码里面一探究竟,由于没有源代码,就只有借用各种反编译工具:
1、Java Decompiler
2、Jadclipse
3、jad
4、jd-gui
…..
等等,还有很多其他的,这里,我选用的是jd-gui,如果是用的idea作为IDE的话,可以直接查看。
借助反编译工具反编译出来的代码如下:
1 | static boolean userIsDept(JdbcTemplate sysJdbcTemplate, final String dept, String userId) { |
经过分析,发现该处的组织id过多加载,因为在授权表中已经将当前用户所属组织的授权内容全量写进去,这儿过多加载,其实把父组织的授权内容也一并拼接到了in条件内,所以出现这种情况。
最后,我通过idea新建一个java项目,把项目的依赖包添加进去,新建了一个同包名、同类名的类,将代码copy进新类,稍作修改,就可导出一个jar包。然后将class文件复制到原来的jar包中覆盖即可,在这里,一定要注意JDK版本,否者会报错。