报表设计工具FineReport如何实现.Net模板访问权限设置1.问题描述
如下图集成报表后,希望不同的用户登录,所能看到的报表是不同的,没有权限的用户查看报表时提示没有权限:
2.解决方案
通过数字签名的方式来验证发送的报表请求,需要带有与FR约定的数字签名方式签名之后的信息,FR验证签名信息合法才允许访问报表,否则返回没有权限。
注:本方案使用MD5+RSA数字签名方式。
标准偏差怎么算
3.实现步骤
3.1前提准备
报表工程:如直接使用内置Jetty服务器中的报表工程WebReport,端口为8075;
用户系统:如用户工程PFDemo发布于IIS服务器,端口为80,可省;
报表工程已经配置了身份验证,并实现了单点登录,如其中存在用户A/123、B/123。
绝境求生手册3.2载入FR提供的BouncyCastle.Crypto.dll及Com.FineReport.dll数字签名库
下载FR提供的BouncyCastle.Crypto.dll及Com.FineReport.dll数字签名库;
在用户系统中载入这两个数字签名库。
3.3用户系统中添加一个web接口给报表工程提供公钥
用户系统中提供一个web接口,如创建一个getKey.aspx,可以通过localhost/getKey.aspx来获取公钥,代码如下:
<%@Page Language="C#"AutoEventWireup="true"CodeBehind="getKey.aspx.cs" Inherits="Key"%>
在页面Page_Load事件中调用我方提供的dll的接口,返回公钥信息,对应的后台cs代码getKey.aspx.cs为:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Com.FineReport;
namespace PFDemo
{
public partial class getKey:System.Web.UI.Page
{
protected void Page_Load(object nder,EventArgs e)
{
if(!IsPostBack)
{
try
{
/
/获得公钥的两个参数,传回
String PublicKeyModulus();
String PublicKeyExponent();
Respon.Write(modulus+"&"+exponent);
}
catch(Exception e1)
{
Respon.Write("error");
}
return;
}
}
}
}
绝对静止以上只是一个样例方式,您也可以通过web服务等方式来提供这个接口。
3.4报表工程中获取用户系统的公钥
登陆FR管理平台localhost:8075/WebReport/ReportServer?op=fr_platform,选择权限配置>详细权限配置;
数字签名密钥地址为localhost/getKey.aspx,点击提交:
3.5用户系统发送报表请求加入数字签名信息
如最上图中登陆后的主界面为index.aspx,代码如下:
<%@Page Language="C#"AutoEventWireup="true"CodeBehind="index.aspx.cs" Inherits="PFDemo._Default"%>
杭椒牛肉<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0Transitional//EN" "www.w3/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="www.w3/1999/xhtml">
<head runat="rver">
<title>PFDemo</title>
<script type="text/javascript">
function viewReport(report){
var ElementById("frame");
f.src="/report.aspx?report="+report;
}
</script>
</head>
<body>
<form id="form1"runat="rver">
<table border="2">
<colgroup>
<col width="150px;"/>
<col/>
</colgroup>
<tr >
<td colSpan="2">
Privilege Demo
<span >Current ur:</span>
<asp:Label ID="Label1"runat="rver"Text=""></asp:Label>
</td>
</tr>
<tr >
<td >
<ul>
<li >
<asp:HyperLink ID="HyperLink1"runat="rver" onclick="javascript:viewReport('GettingStarted.cpt');">Report1(A,B)</asp:HyperLink>
</li>
<li >
<asp:HyperLink ID="HyperLink2"runat="rver" onclick="javascript:viewReport('doc/Primary/CrossReport/Cross.cpt');">Report2(A)</asp:HyperLink>
</li>
</ul>
</td>
<td>
<iframe id="frame"name="frame"width="100%"height="730px;"/> </td>
</tr>
</table>
</form>
</body>
</html>
当点击左边报表节点时,触发viewReport这个js方法,通过iframe执行report.aspx文件,并传递请求查看的报表名字。
走进书里去在report.aspx中利用FR数字签名库提供的接口,对需要访问的报表路径、报表浏览形式(op)、当前用户名与当前系统时间进行数字签名,得到签名信息,并将签名信息加入请求中转发给报表工程,代码如下:
<%@Page Language="C#"AutoEventWireup="true"CodeBehind="Report.aspx.cs" Inherits="PFDemo.Report"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0Transitional//EN" "www.w3/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="www.w3/1999/xhtml">
<head runat="rver">
<title></title>
</head>
<body>
<form id="form1"runat="rver">
大年初三祝福语<div>
</div>
</form>
</body>
盐酸托哌酮</html>
对应的后台cs代码Report.aspx.cs为:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Com.FineReport;
namespace PFDemo
{
public partial class Report:System.Web.UI.Page
{
protected void Page_Load(object nder,EventArgs e)
{
if(!IsPostBack)
{
String reportPath=Request.QueryString["report"];
String urname=(String)Session["urname"];//获取当前用户名
String op="page";//默认分页预览时,null即可
long CurTime4JavaPlatform();//获取与java平台同步的当前时间的毫秒数
String signInfo=FRPrivilegeFilterHelper.sign(reportPath,op,urname, curtime);//将上述获得的四个要素传入,获得相关的数字签名信息
String path="localhost:8075/WebReport/ReportServer?reportlet="+ reportPath+"&op="+op
+"&"+
FRPrivilegeFilterHelper.FR_DIGITALSIGNATURE_CURRENT_TIME+"="+curtime
+"&"+FRPrivilegeFilterHelper.FR_DIGITALSIGNATURE_INFO +"="+signInfo;//模拟拼接url,其实就是原有正常请求之后添加上签名的当前时间,和签名信息
Respon.Redirect(path,true);
}
}追结构
}
}
报表工程得到报表请求后进行验证,对reportlet参数值、op参数值、报表系统中当前用户名、发送来的系统时间进行数字签名验证是否正确。
且若用户系统发送来的签名时系统时间,与当前时间差超过90秒,将视为超时。如果都验证通过,则可以访问报表,否则提示没有权限查看。
3.6重启服务器
重启用户系统服务器及报表服务器(注意:必须先启动用户系统再启动报表系统),设置即可生效,效果如上图。