1. 概述编辑
1.1 版本
报表服务器版本 | JAR 包版本 |
---|---|
10.0 | 2019-11-06 |
1.2 问题描述
报表中设置了网络报表类型的超级链接,如果用户没有超级链接指向的子报表的权限,那么用户在点击了超级链接后是否可以查看子报表呢?超级链接的子报表是否可以继承主报表的权限呢?
下面将梳理超级链接继承权限的逻辑。让用户可以清晰了解 FineReport 超级链接继承权限避免权限泄露的方法。
注1:由于 URL 中超链跳转会带上 hyperlinktoken,因而在半小时有效期内,拥有该 token 就能查看其他所有模板的数据,这会导致越权访问。故2019-12-06及之后版本的 JAR 包加上了用户登录限制。
注2:FineReport 无分享功能,所谓的分享就是拷贝当前报表的 URL 给其他人。
2. 逻辑说明编辑
用户可以在两种场景下打开 FineReport 报表:在决策平台打开和不在决策平台平台打开。这两种场景下配置报表权限的方式是不同的。
2.1 报表在决策平台打开
如果用户直接使用 FineReport 决策平台打开报表,该场景下用户主要是通过目录权限配置模板权限,模板认证可能是所有模板都需要认证,即平台外访问模板可能无权限。
如果用户没有超链打开的子报表的权限,这个时候想要查看该子报表,就需要让子报表继承主报表的权限,因为如果再去设置一遍子报表的模板认证权限会比较繁琐。
为了便于理解,给出详细的用户操作场景示例说明:
操作场景 | 认证&权限 | 2019-12-06之后版本 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章节的内容来配置模板权限。
2.2 报表不在决策平台打开
如果用户将报表集成到自己的系统中打开,该场景下用户主要通过模板认证配置模板权限。模板认证的详细内容参见:模板认证。
这个时候超链打开的子报表,也需要继承主报表权限。这个也很常见,因为在报表很多的情况下,管理员通常只会设置主报表的权限,超链的子报表可能会很多,这个时候如果逐个设置权限会很麻烦。
同样为了便于理解,给出详细的用户操作场景示例说明:
1)角色权限认证
操作场景 | 认证&权限 | 2019-12-06之后版本 JAR 包查看超链子表 |
---|---|---|
用户A>打开报表1>超链到报表2 | 报表1和报表2都需要认证 用户A有报表1的权限,无报表2的权限 | token 未超时前用户A可直接查看报表2 token 超时后用户A需要重新用报表1的超链打开,且报表1也需要重新登录 |
用户A>打开报表1>超链到报表2>拷贝报表2的 URL 到新的浏览器 | 报表1和报表2都需要认证 用户A有报表1的权限,无报表2的权限 用户B有报表2的权限 | 提示登录,用户A登录后: token 未超时前可查看报表2 token 超时后需要重新用报表1的超链打开 提示登录,用户B登录后: 可正常查看报表2中的有权限数据 |
用户A>打开报表1>超链到报表2>拷贝报表2的 URL 到同一浏览器的新标签页 | 报表2需要认证 用户A无报表2的权限 | token 未超时前用户A无需登录可查看报表2 token 超时后用户A需要重新用报表1的超链打开 |
2)仅认证用户密码
操作场景 | 认证&权限 | 2019-12-06之后版本 JAR 包查看超链子表 |
---|---|---|
用户A>打开报表1>超链到报表2 | 报表2都需要认证 | token 未超时前用户A可查看报表2 token 超时后用户A刷新报表2,重新登录即可 |
用户A>打开报表1>超链到报表2>拷贝报表2的 URL 到新的浏览器 | 报表1和报表2都需要认证 用户B有报表2的权限 | 提示登录,用户A登录后: token 未超时前可查看报表2 超时需要重新登录 提示登录,用户B登录后: token 未超时前可查看报表2中有权限的数据 超时需要重新登录 |
用户A>打开报表1>超链到报表2>拷贝报表2的 URL 到同一浏览器的新标签页 | 报表2需要认证 | token 未超时前用户A无需登录即可查看报表2 token 超时后用户A需重新登录查看 |
3)数字签名
操作场景 | 认证&权限 | 2019-12-06之后版本 JAR 包查看超链子表 |
---|---|---|
用户A>打开报表1>超链到报表2 | 报表1和报表2都需要认证 | token 未超时前用户A可查看报表2 token 超时后用户A需要重新用报表1的超链打开,但要确保报表1的数字签名未超时,否则无效 |
用户A>打开报表1>超链到报表2>拷贝报表2的 URL 到新的浏览器 | ||
用户A>打开报表1>超链到报表2>拷贝报表2的 URL 到同一浏览器的新标签页 |
4)不开启认证
操作场景 | 2019-12-06之后版本 JAR 包查看超链子表 |
---|---|
用户A>打开报表1>超链到报表2 | 不管 token 是否超时,用户A都能查看报表2 |
用户A>打开报表1>超链到报表2>拷贝报表2的 URL 到新的浏览器 | 不管 token 是否超时,用户A或者用户B都能查看报表2 |
用户A>打开报表1>超链到报表2>拷贝报表2的 URL 到同一浏览器的新标签页 | 不管 token 是否超时,用户A都能查看报表2 |