报表单独部署时跨应用访问报表安全控制

2023-10-17 12:32

本文主要是介绍报表单独部署时跨应用访问报表安全控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

 

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

 

案例场景:

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

 

解决思路:

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

 

实现方法:

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

正常访问报表url为:http://127.0.0.1:6001/demo/reportJsp/showReport.jsp?raq=test.raq

这个url就当做用户系统请求一张报表的url,这时可以在这个url后加上登录用户系统的ip,假设用户以192.168.0.58这个ip登陆的,那么url为:http://127.0.0.1:6001/demo/reportJsp/showReport.jsp?raq=test.raq&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://www.chinasem.cn/article/225439

相关文章

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA