web报表控件FineReport中如何设置数据签名验证

2025-10-14 13:24:42

1、使用方法

通过数字签名的方式来验证发送的报表请求,需要带有与FR约定的数字签名方式签名之后的信息,FR验证签名信息合法才允许访问报表,否则返回没有权限。

注:本方案使用 MD5+RSA数字签名方式。

web报表控件FineReport中如何设置数据签名验证

2、 jar包准备

在使用FR的数字签名时,必须下载fr-pfh-java-7.0.jar包,选择权限集成-JAVA资源>fr-pfh-java-7.0.jar,拷贝至报表工程WebReport\WEB-INF\lib及用户系统(假设用户系统工程名为PFDemo,端口号为8080)PFDemo\WEB-INF\lib下。(注意:报表工程与用户系统下都要有);

将报表工程WebReport\WEB-INF\lib下的fr-third-7.1.jar包拷贝至用户系统PFDemo\WEB-INF\lib下。

3、用户系统中添加一个web接口给报表工程提供公钥

这个接口是一个地址,比如在用户系统中注册一个servlet,访问这个servlet来获得公钥,http://localhost:8080/PFDemo/DemoServer?cmd=getkey:

DemoServer这个servlet所对应的类为demo.DemoServlet,代码如下:

package demo;

import java.io.IOException;

import java.io.PrintWriter;

import java.math.BigInteger;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.fr.pf.java.FRPrivilegeFilterHelper;

public class DemoServlet extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {

    doPost(req, res);

    }

    

    /**

     * 这里只是示例,就简单处理,不做分层了

     */

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {

    String cmd = req.getParameter("cmd");

    if ("getkey".equals(cmd)) {

    dealWithKey(req, res);

    }

    }

    

    private void dealWithKey(HttpServletRequest req, HttpServletResponse res) throws IOException {

    PrintWriter writer = new PrintWriter(res.getOutputStream());

    try {

    // 获得公钥的两个参数,传回

BigInteger modulus = FRPrivilegeFilterHelper.getPublicKeyModulus();

BigInteger exponent = FRPrivilegeFilterHelper.getPublicKeyExponent();

writer.write(modulus.toString() + "&" + exponent.toString());

} catch (Exception e) {

e.printStackTrace();

writer.write("error");

}

writer.flush();

writer.close();

    }

}

编译后的类保存在PFDemo\WEB-INF\classes\demo\DemoServlet.class。

4、报表工程中获取用户系统的公钥

登陆管理平台,选择管理系统>权限配置>设置,模板权限控制方式选择数字签名认证。

数字签名密钥地址为http://localhost:8080/PFDemo/DemoServer?cmd=getkey,点击确定:

web报表控件FineReport中如何设置数据签名验证

5、用户系统发送报表请求加入数字签名信息

利用fr-pfh-java-7.0.jar提供的接口,对需要访问的报表路径、报表浏览形式(op)、当前用户名与当前系统时间进行数字签名,得到签名信息,并将签名信息加入请求中转发给报表工程,代码如下:

<%@page contentType="text/html;charset=gbk" import="com.fr.pf.java.*" pageEncoding="gbk"%>

<%

String reportPath = request.getParameter("report");   // 获得需要访问的报表路径,即我方reportlet参数

String username = (String)request.getSession().getAttribute("username");  // 获取当前用户名

String op = "page";  // 默认分页预览时,null即可

long curtime = System.currentTimeMillis();  // 获取当前时间

String signInfo = FRPrivilegeFilterHelper.sign(reportPath, op, username, curtime);   // 将上述获得的四个要素传入,获得相关的数字签名信息

String path = "http://localhost:8075/WebReport/ReportServer?reportlet=" + reportPath + "&op=" + op 

              + "&" + FRPrivilegeFilterHelper.FR_DIGITALSIGNATURE_CURRENT_TIME + "=" + curtime

              + "&" + FRPrivilegeFilterHelper.FR_DIGITALSIGNATURE_INFO + "=" + signInfo;   // 模拟拼接url,其实就是原有正常请求之后添加上签名的当前时间,和签名信息

%>

<html>

<head>

   <title>Privilege Demo</title>

</head>

<body bgcolor="#FFFFFF" style="padding: 0pt; border: 0pt none; margin: 0pt; overflow: hidden;">

    <iframe id="frame" src="<%=path%>" name="frame

</body>

</html>

报表工程得到报表请求后进行验证,对reportlet参数值、op参数值、报表系统中当前用户名、发送来的系统时间进行数字签名验证是否正确。

且若用户系统发送来的签名时系统时间,与当前时间差超过90秒,将视为超时。如果都验证通过,则可以访问报表,否则提示没有权限查看。

6、重启服务器

重启用户系统服务器及报表服务器(注意:必须先启动用户系统再启动报表系统),设置即可生效,效果如上图。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢