1. 概述
1.1 版本
報表服務器版本 | JAR 包版本 |
---|---|
10.0 | 2019-12-05 |
1.2 問題描述
報表中設置了網絡報表類型的超級鏈接,如果用戶沒有超級鏈接指向的子報表的權限,那麽用戶在點擊了超級鏈接後是否可以查看子報表呢?超級鏈接的子報表是否可以繼承主報表的權限呢?
下面将梳理超級鏈接繼承權限的邏輯。讓用戶可以清晰了解 FineReport 超級鏈接繼承權限避免權限洩露的方法。
注1:由於 URL 中超鏈跳轉會帶上 hyperlinktoken,因而在半小時有效期内,擁有該 token 就能查看其他所有模板的數據,這會導緻越權訪問。故2019-12-05及之後版本的 JAR 包加上了用戶登錄限制。
注2:FineReport 無分享功能,所謂的分享就是拷貝當前報表的 URL 給其他人。
2. 邏輯說明
用戶可以在兩種場景下打開 FineReport 報表:在決策平台打開和不在決策平台平台打開。
這兩種場景下配置報表權限的方式是相同的,都是通過模板認證配置模板權限,模板認證的詳細内容參見:模板認證
注:只有超鏈方式爲模板路徑時,超鏈權限才能繼承。以下兩種方式不支持權限繼承:
1)參數直接寫在模板路徑後面
2)網頁鏈接中填寫模板預覽 URL
2.1 報表在決策平台打開
如果用戶直接使用 FineReport 決策平台打開報表,該場景下只有三種類型的模板訪問方式校驗模板權限:模板類型首頁、通過鏈接挂載模板的首頁、通過鏈接挂載模板的目錄。
平台目錄直接挂載模板不校驗模板權限,只需要在權限管理>權限配置給對應用戶配置目錄權限,用戶即可正常查看模板内容。
如果用戶沒有超鏈打開的子報表的權限,這個時候想要查看該子報表,就需要讓子報表繼承主報表的權限,因爲如果再去設置一遍子報表的模板認證權限會比較繁瑣。
爲了便於理解,給出詳細的用戶操作場景示例說明(此處只介紹角色認證場景)
操作場景 | 認證&權限 | 2019-12-05之後版本 JAR 包查看超鏈子表 |
---|---|---|
用戶A登錄平台>打開報表1>超鏈到報表2 | 報表2需要認證 用戶A無報表2的權限 | 新窗口/平台内新标簽/對話框/當前頁/平台内當前标簽頁打開:都能直接查看報表2 |
用戶A登錄平台>打開報表1>超鏈到報表2>拷貝報表2的 URL 到新的浏覽器 | 報表2需要認證 用戶A無權限 用戶B有權限 用戶C無權限 | 提示登錄,用戶A登錄後: token 未超時前可查看報表2 token 超時後不可查看,需要重新用報表1的超鏈打開 提示登錄,用戶B登錄後: 可以查看報表2,且模板數據會按用戶B的權限進行過濾 提示登錄,用戶C登錄後: 提示沒有權限 |
用戶A登錄平台>打開報表1>超鏈到報表2>拷貝報表2的 URL 到同一浏覽器的新标簽頁 | 報表2需要認證 用戶A無報表2的權限 | token 未超時前可查看報表2 token 超時後不可查看,需要重新用報表1的超鏈打開 |
2.2 報表不在決策平台打開
如果用戶将報表集成到自己的系統中打開,該場景下用戶也需要通過模板認證配置模板權限。
這個時候超鏈打開的子報表,也需要繼承主報表權限。這個也很常見,因爲在報表很多的情況下,管理員通常只會設置主報表的權限,超鏈的子報表可能會很多,這個時候如果逐個設置權限會很麻煩。
同樣爲了便於理解,給出詳細的用戶操作場景示例說明:
1)角色權限認證
操作場景 | 認證&權限 | 2019-12-05之後版本 JAR 包查看超鏈子表 |
---|---|---|
用戶A>打開報表1>超鏈到報表2 | 報表1和報表2都需要認證 用戶A有報表1的權限,無報表2的權限 | token 未超時前用戶A可直接查看報表2 token 超時後提示登錄,用戶A登錄不可查看報表2,需要重新用報表1的超鏈打開,且報表1也需要重新登錄 |
用戶A>打開報表1>超鏈到報表2>拷貝報表2的 URL 到新的浏覽器 | 報表1和報表2都需要認證 用戶A有報表1的權限,無報表2的權限 用戶B有報表2的權限 | 提示登錄,用戶A登錄後: token 未超時前可查看報表2 token 超時後提示登錄,用戶A登錄後不可查看報表2,需要重新用報表1的超鏈打開 提示登錄,用戶B登錄後: 可正常查看報表2中的有權限數據 |
用戶A>打開報表1>超鏈到報表2>拷貝報表2的 URL 到同一浏覽器的新标簽頁 | 報表2需要認證 用戶A無報表2的權限 | token 未超時前用戶A無需登錄可查看報表2 token 超時後提示登錄,用戶A登錄後不可查看報表2,需要重新用報表1的超鏈打開 |
2)僅認證用戶密碼
操作場景 | 認證&權限 | 2019-12-05之後版本 JAR 包查看超鏈子表 |
---|---|---|
用戶A>打開報表1>超鏈到報表2 | 報表2都需要認證 | token 未超時前用戶A可查看報表2 token 超時後用戶A刷新報表2,提示登錄,任意用戶登錄可正常查看報表2内容 |
用戶A>打開報表1>超鏈到報表2>拷貝報表2的 URL 到新的浏覽器 | 報表1和報表2都需要認證 | 提示登錄,用戶A登錄後: token 未超時前可查看報表2 超時需要重新登錄,登錄後正常查看 提示登錄,用戶B登錄後: token 未超時前可查看報表2中有權限的數據 超時需要重新登錄,登錄後正常查看 |
用戶A>打開報表1>超鏈到報表2>拷貝報表2的 URL 到同一浏覽器的新标簽頁 | 報表2需要認證 | token 未超時前用戶A無需登錄即可查看報表2 token 超時後用戶A需重新登錄可正常 |
3)數字簽名
操作場景 | 認證&權限 | 2019-12-05之後版本 JAR 包查看超鏈子表 |
---|---|---|
用戶A>打開報表1>超鏈到報表2 | 報表1和報表2都需要認證 | token 未超時前用戶A可查看報表2 token 超時後報表2不可查看,需要重新用報表1的超鏈打開,但要确保報表1的數字簽名未超時,否則無效 |
用戶A>打開報表1>超鏈到報表2>拷貝報表2的 URL 到新的浏覽器 | ||
用戶A>打開報表1>超鏈到報表2>拷貝報表2的 URL 到同一浏覽器的新标簽頁 |
4)不開啓認證
操作場景 | 2019-12-05之後版本 JAR 包查看超鏈子表 |
---|---|
打開報表1>超鏈到報表2 | 不需要登錄,可一直查看報表1和報表2内容 |
打開報表1>超鏈到報表2>拷貝報表2的 URL 到新的浏覽器 | 不需要登錄,可一直查看報表1和報表2内容 |
打開報表1>超鏈到報表2>拷貝報表2的 URL 到同一浏覽器的新标簽頁 | 不需要登錄,可一直查看報表1和報表2内容 |