博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
报表单独部署时跨应用访问报表安全控制
阅读量:6656 次
发布时间:2019-06-25

本文共 2307 字,大约阅读时间需要 7 分钟。

润乾报表与用户的系统集成,一般有两种方案。一是集成到用户系统中。二是将润乾单独部署到一个应用下。

两种方案各有利弊:第一种方案对于安全性等方面可以统一管理,但是报表本身如果数据量大并发大造成的压力会直接影响用户自己的系统。第二种方案在报表服务器承受压力过大数据量过大的时候,不会影响到用户本身的系统,也就是说就算报表服务器压力饱和进入等待状态,用户的系统也可以正常的使用,众所周知润乾报表的调用一般直接通过url的方式进行调用,那么第二种方案中的url就无法被用户系统所控制,造成了一定的安全隐患。

 

下面就介绍几种解决此类问题的方案之中的一种:通过ip在过滤器中判断权限。

 

案例场景:

通过用户系统访问一张报表时,当然会带着一些用户信息或是其他参数传递过来。如果这时这个url被其他人复制或者记住,拿到其他客户机上直接访问,由于采用的是第二种方案,用户系统并不能控制,就会导致信息的泄漏。

 

解决思路:

这时我们可以采取从用户系统获取客户端ip然后拼成访问报表的参数,传递到报表服务器,然后在报表服务器中对该ip是否有权限打开这张报表进行判断,如果有权限继续访问,如果没有权限跳转到错误页面或者用户登陆页面等。

 

实现方法:

一、首先搭建报表服务器,这里以润乾自带demo为例。

正常访问报表url为:

这个url就当做用户系统请求一张报表的url,这时可以在这个url后加上登录用户系统的ip,假设用户以192.168.0.58这个ip登陆的,那么url为:&ipValue=192.168.0.58

二、写一个filter

在doFilter中获取url中带的的参数以及客户端的ip,然后进行比较

public void doFilter(ServletRequest request, ServletResponse response,

           FilterChain filterChain) throws IOException, ServletException {

       // 过滤器获取客户端IP地址

       String ip = ((HttpServletRequest) request).getHeader(“x-forwarded-for”);

       if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {

           ip = ((HttpServletRequest) request).getHeader(“Proxy-Client-IP”);

       }

       if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {

           ip = ((HttpServletRequest) request).getHeader(“WL-Proxy-Client-IP”);

       }

       if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {

           ip = ((HttpServletRequest) request).getHeader(“HTTP_CLIENT_IP”);

       }

       if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {

           ip = ((HttpServletRequest) request)

                  .getHeader(“HTTP_X_FORWARDED_FOR”);

       }

       if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {

           ip = request.getRemoteAddr();

       }

       // 根据获取的客户端IP,进行判断,返回相关结果为isValid=true

       boolean isValid = false;

       String ipValue = request.getParameter(“ipValue”);

       if (ip.equals(ipValue)) {// 自行增加条件

           isValid = true;

       }

       // 如果满足条件允许登录,否则调准

       if (isValid) {

           request.setCharacterEncoding(“GBK”);

           filterChain.doFilter(request, response);

       } else {

           request.setCharacterEncoding(“GBK”);

           // 定向到Error页面,或者指定跳到登录界面

           request.getRequestDispatcher(“/reportJsp/iperror.jsp”).forward(

                  request, response);

       }

    }

 

三、在web.xml中加入filter配置

<filter>

      <filter-name>IpFilter</filter-name>

       <filter-class>com.runqian.filter.IpFilter</filter-class>

     </filter>

    <filter-mapping>

    <filter-name>IpFilter</filter-name>

      <url-pattern>/*</url-pattern>

     </filter-mapping>

 

然后重启服务,如果将url拷贝到其他ip的客户端访问,救活跳转到相应的错误页面

转载地址:http://blxto.baihongyu.com/

你可能感兴趣的文章
Kafka manager安装 (支持0.10以后版本consumer)
查看>>
POJ 2728 Desert King [最优比率生成树]
查看>>
在python3.3后urllib2已经不能再用,只能用urllib.request来代替
查看>>
Redis在C#中的使用及Redis的封装
查看>>
实体框架高级应用之动态过滤 EntityFramework DynamicFilters
查看>>
轨迹系列1——一种基于路网图层的GPS轨迹优化方案
查看>>
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2 新增解压缩工具类ZipHelper
查看>>
360多渠道打包
查看>>
UE如何使用正则表达式
查看>>
Unity3D中暂停时的动画及粒子效果实现
查看>>
《你不知道的JavaScript》整理(五)——值与原生函数
查看>>
了解一下爬虫技术方方面面
查看>>
mini-uboot 启动过程简单分析
查看>>
linux桌面创建快捷方式
查看>>
Python实例浅谈之五Python守护进程和脚本单例运行
查看>>
CentOS 6.8 安装最新版 Git
查看>>
TransactionScope的用法
查看>>
com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为队列管理器提供的安全性认证无效...
查看>>
oracle goldengate技术架构-简单试验(全)
查看>>
Swift3 获取当前连接WIFI名称
查看>>