1. 概述编辑
1.1 版本
报表服务器版本 | JAR 包版本 |
---|---|
10.0 | 2019-11-05 |
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 报表不在决策平台打开
如果用户将报表集成到自己的系统中打开,该场景下用户也需要通过模板认证配置模板权限。
这个时候超链打开的子报表,也需要继承主报表权限。这个也很常见,因为在报表很多的情况下,管理员通常只会设置主报表的权限,超链的子报表可能会很多,这个时候如果逐个设置权限会很麻烦。
同样为了便于理解,给出详细的用户操作场景示例说明:
1)角色权限认证
操作场景 | 认证&权限 | 2019-12-06之后版本 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-06之后版本 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-06之后版本 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-06之后版本 JAR 包查看超链子表 |
---|---|
打开报表1>超链到报表2 | 不需要登录,可一直查看报表1和报表2内容 |
打开报表1>超链到报表2>拷贝报表2的 URL 到新的浏览器 | 不需要登录,可一直查看报表1和报表2内容 |
打开报表1>超链到报表2>拷贝报表2的 URL 到同一浏览器的新标签页 | 不需要登录,可一直查看报表1和报表2内容 |