電子表格FineReport教程:[14]模板許可權的控制?

下面就通過電子表格FineReport來簡單介紹一下如何進行設定。

工具/原料

電子表格FineReport7.1.1

大小:148.2M 適用平臺:windows/linux

方法/步驟

問題描述

如下圖整合報表後,希望不同的使用者登入,所能看到的報表是不同的,沒有許可權的使用者檢視報表時提示沒有許可權:

電子表格FineReport教程:[14]模板許可權的控制

解決方案

通過數字簽名的方式來驗證傳送的報表請求,需要帶有與FR約定的數字簽名方式簽名之後的資訊,FR驗證簽名信息合法才允許訪問報表,否則返回沒有許可權。

注:本方案使用 MD5+RSA數字簽名方式。

電子表格FineReport教程:[14]模板許可權的控制

適用情況

前面3個章節的許可權控制方式是針對那些比較簡單的系統而言的,那麼對那些很複雜的系統,使用前面3中許可權配置方式就行不通了,這個時候就可以用數字簽名的方式進行許可權配置。

前提準備

報表工程:如直接使用內建Jetty伺服器中的報表工程WebReport,埠為8075;

使用者系統:如使用者工程(在PFDemo目錄)釋出於Tomcat伺服器,埠為8080;

PFDemo下有檔案login.html(使用者的登陸介面)、index.jsp(登陸後的主介面)、report.jsp(對報表請求進行簽名,將簽名信息加入請求中轉發給報表工程)。注:下面有對應檔案的完整程式碼。

配置好報表端的身份驗證>並與使用者系統實現單點登入:

如該例我們使用資料集驗證,使用者-密碼伺服器資料集定義如下:

電子表格FineReport教程:[14]模板許可權的控制

點選管理系統>使用者管理>設定,認證方式使用預設的平臺內建認證,配置使用者同步資料集,如下圖:

電子表格FineReport教程:[14]模板許可權的控制

修改使用者登入介面login.html,實現單點登入,程式碼如下:

拷貝jar包

下載fr-pfh-java-7.0.jar包,選擇許可權整合-JAVA資源>fr-pfh-java-7.0.jar,拷貝至報表工程WebReport\WEB-INF\lib及使用者系統PFDemo\WEB-INF\lib下(注意:報表工程與使用者系統下都要有);

將報表工程WebReport\WEB-INF\lib下的fr-third-7.0.jar包拷貝至使用者系統PFDemo\WEB-INF\lib下。

使用者系統中新增一個web介面給報表工程提供公鑰

這個介面是一個地址,比如在使用者系統中註冊一個servlet,訪問這個servlet來獲得公鑰,

在使用者系統的PFDemo\WEB-INF\web.xml中新增一個servlet:

Demo WebApp

DemoServer

demo.DemoServlet

0

DemoServer

/DemoServer

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();

}

}

報表工程中獲取使用者系統的公鑰

選擇許可權配置>詳細許可權配置;

點選提交:

電子表格FineReport教程:[14]模板許可權的控制

使用者系統傳送報表請求加入數字簽名信息

如最上圖中登陸後的主介面為index.jsp,程式碼如下:

<%@page contentType="text/html;charset=gbk" pageEncoding="gbk"%>

<%

String username = request.getParameter("username");

String password = request.getParameter("password");

// 下面是使用者系統對登陸使用者名稱和密碼的驗證,以下用最簡單的程式碼做示例

if ("A".equals(username) && "123".equals(password)) {

request.getSession().setAttribute("username", "A");

} else if ("B".equals(username) && "123".equals(password)) {

request.getSession().setAttribute("username", "B");

} else {

request.getSession().setAttribute("username", "");

}

%>

Privilege Demo

Privilege Demo

Current user:

<%=username%>

<% if ("A".equals(request.getSession().getAttribute("username"))) {

%>

  • Report1(A,B)

  • Report2(A)

<%

} else if ("B".equals(request.getSession().getAttribute("username"))) {

%>

  • Report1(A,B)

<%

}

%>

</p> <p></td></p> <p></tr></p> <p></table></p> <p></body></p> <p></html></p> <p>當點選左邊報表節點時,觸發viewReport這個js方法,通過iframe執行report.jsp檔案,並傳遞請求檢視的報表名字。</p> <p>在report.jsp中利用fr-pfh-java-7.0.jar提供的介面,對需要訪問的報表路徑、報表瀏覽形式(op)、當前使用者名稱與當前系統時間進行數字簽名,得到簽名信息,並將簽名信息加入請求中轉發給報表工程,程式碼如下:</p> <p><%@page contentType="text/html;charset=gbk" import="com.fr.pf.java.*" pageEncoding="gbk"%></p> <p><%</p> <p>String reportPath = request.getParameter("report"); // 獲得需要訪問的報表路徑,即我方reportlet引數</p> <p>String username = (String)request.getSession().getAttribute("username"); // 獲取當前使用者名稱</p> <p>String op = "page"; // 預設分頁預覽時,null即可</p> <p>long curtime = System.currentTimeMillis(); // 獲取當前時間</p> <p>String signInfo = FRPrivilegeFilterHelper.sign(reportPath, op, username, curtime); // 將上述獲得的四個要素傳入,獲得相關的數字簽名信息</p> <p>String path = "; + reportPath + "&amp;op=" + op</p> <p>+ "&amp;" + FRPrivilegeFilterHelper.FR_DIGITALSIGNATURE_CURRENT_TIME + "=" + curtime</p> <p>+ "&amp;" + FRPrivilegeFilterHelper.FR_DIGITALSIGNATURE_INFO + "=" + signInfo; // 模擬拼接url,其實就是原有正常請求之後新增上簽名的當前時間,和簽名信息</p> <p>%></p> <p><html></p> <p><head></p> <p><title>Privilege Demo</title></p> <p></head></p> <p><body bgcolor="#FFFFFF" style="padding: 0pt; border: 0pt none; margin: 0pt; overflow: hidden;"></p> <p><iframe id="frame" src="<%=path%>" name="frame" width="100%" height="100%"/></p> <p></body></p> <p></html></p> <p>報表工程得到報表請求後進行驗證,對reportlet引數值、op引數值、報表系統中當前使用者名稱、傳送來的系統時間進行數字簽名驗證是否正確。</p> <p>且若使用者系統傳送來的簽名時系統時間,與當前時間差超過90秒,將視為超時。如果都驗證通過,則可以訪問報表,否則提示沒有許可權檢視。</p> <p>重啟伺服器</p> <p>重啟使用者系統伺服器及報表伺服器(注意:必須先啟動使用者系統再啟動報表系統),設定即可生效,效果如上圖。</p> <p>相關demo詳細請前往許可權整合java版demo頁面下載,選擇許可權整合-JAVA資源>demo.rar即可。</p> <p>何謂數字簽名?</p> <p>目前的數字簽名是建立在公共金鑰體制基礎上,它是公用金鑰加密技術的另一類應用。它的主要方式是:報文的傳送方從報文文字中生成一個128位的雜湊值(或報文摘要)。</p> <p>傳送方用自己的私人金鑰對這個雜湊值進行加密來形成傳送方的數字簽名。這個數字簽名將作為報文的附件和報文一起傳送給報文的接收方。</p> <p>報文的接收方首先從接收到的原始報文中計算出128位的雜湊值(或報文摘要),再用傳送方的公用金鑰來對報文附加的數字簽名進行解密。</p> <p>如果兩個雜湊值相同、那麼接收方就能確認該數字簽名是傳送方的。通過數字簽名能夠實現對原始報文的鑑別。</p><!-- lightBox --><!-- / lightBox -->

教程, 許可權, 模板, 報表, 電子表格,
相關問題答案