报表预览页面正式上线以后,用户那边往往会同时提出两类要求:一类是正常地把报表导出成PDF文件,另一类则是要限制一部分账号,不让他们随便下载那些比较敏感的报表内容。要想处理好DevExpress Document Viewer怎么导出PDF这个问题,以及怎么把导出权限控制住,就需要把界面上的操作和服务端的校验拆成两层来看。如果仅仅把某个按钮从工具栏里藏起来,最多只是减少了误操作的可能,完全不能替代真正靠得住的权限校验。
一、DevExpress Document Viewer怎么导出PDF
Document Viewer本身就支持在预览页面里完成查看、打印和导出报表这些事。在Web端,可以直接从它自带的工具栏上挑选要输出的文件格式,像PDF、XLSX、DOCX、CSV,还有图片等等,都可以按照实际需要来用。
1、先打开报表的预览页面
进到那个已经集成好Document Viewer的业务页面里面,先要耐心地等报表完整加载出来,如果报表本身的页数特别多,就得多确认一下预览区域是不是已经正常显示了,切记不要在报表还在后台生成的过程当中,连续地去点击导出按钮,那样很容易导出一份不完整的文件。
2、接着点击导出按钮
在工具栏上找到【Export To】这一项并点开它,然后从展开的格式列表里选中【PDF File】。有些项目在点选之后,还会先弹出一个【Export Options】的窗口,在这里可以去调整页面输出的范围、图像的品质、文件的兼容性,还有像文档标题这类信息,都设好以后,再点确认去执行导出。按照DevExpress官方给出的说明,在导出PDF之前,是可以在导出选项的面板里,专门针对PDF设置一些专属参数的。
3、再去检查下载下来的结果
浏览器会开始下载这份PDF文件,或者根据浏览器自身的设定弹出一个保存的窗口。等文件到了本地以后,一定要打开它,仔细核对一下页码是不是连续的、字体有没有变形、图片位置对不对、分页符有没有错乱,还有表格的宽度会不会撑破页面。如果预览时看起来正常,但导出的PDF却出现了错位,那就应该回头去检查报表布局本身的问题,不要只盯着浏览器页面去调整。
4、需要后台导出时就单独处理
如果业务系统并不希望用户非得跑进预览页面里去操作,那我们也可以完全在服务端去调用报表导出的相关方法,让它直接生成一份PDF,再把生成好的文件返回给前端。这种处理方式就比较适合用来做定时跑的报表、需要批量归档的场景,还有那些格式固定的模板下载。
二、DevExpress Document Viewer导出权限怎么限制
导出权限的控制,最好按风险的高低来分一分层。那些普通的报表,完全可以直接放开PDF下载,可是一旦涉及到财务数据、客户资料还是内部的经营报表,就得严格地按照用户的角色、他所归属的组织范围,还有报表本身的归属来加以控制了。
1、先把不需要的导出格式藏起来
在Web Document Viewer里,可以通过CustomizeExportOptions这个事件,把某几种指定的格式给隐藏掉,只要调用了HideFormat方法,那种格式就会从【Export To】的列表以及导出选项的面板里彻底消失。举个例子,假如只允许导出PDF,那就可以把XLS、XLSX、CSV还有DOCX这几种格式统统藏起来,让界面干干净净的。
2、再按角色把整个导出入口也隐藏掉
如果有一类用户只能查看报表,但是不允许他们下载任何文件,那我们就可以利用CustomizeMenuActions这样一个事件,去调整工具栏里的命令集合,直接把【Export To】这个入口整个藏起来,或者让它变成灰色不可用的状态。这个事件可以拿到Document Viewer中各项命令的集合,然后分别去改动每一条命令到底是可见的还是禁用掉的。
3、服务端这边必须再做一次校验
前端那些按钮的隐藏做完以后,还远远不够,因为请求照样可以直接发到服务端来,所以一定要在后端再拦截一次。DevExpress提供了IWebDocumentViewerAuthorizationService这个接口,可以用它来限制谁能访问哪些报表和已经生成好的文档;在异步导出的场景里,也还可以使用IExportingAuthorizationService,专门去限制对导出文件的读取权限。按照官方的建议,最好是把控制器、报表本身、生成的文档以及导出的文件,这好几层都一起保护起来。
4、不要把文件地址长期暴露出去
经过导出生成的文件,它的访问地址应当绑定到当前登录的用户、当前的会话,或者设置一个短期有效的下载标识。用户A自己生成的那份文件,绝对不能让用户B仅凭着一条文件地址就轻松下载到。对于异步导出这种情况,服务端还需要额外检查一下,这次请求的导出结果是不是真的属于当前这个用户,而不能任何人都能随意来拿。
三、DevExpress Document Viewer导出控制怎么复核
等所有的权限配置都做完以后,不能光拿管理员这一个账号去测试就了事,至少要准备好三种不同的测试账号:一种是只能查看不能导出的普通用户,一种是被允许导出的用户,还有一种则是完全没有相关权限的用户。
1、验证一下界面上的表现
用普通用户登进去,应该完全看不到【Export To】这个按钮,或者这个按钮是灰色的点不动;而对于那些允许导出的用户,则要保证他们只能看到那些被允许的格式,不该看到的格式一条也不能露出来。
2、接着验证接口拦截是否有效
拿那个没有权限的账号,尝试直接去访问导出文件的请求地址,看看服务端是不是会毫不客气地拒绝这次下载。如果按钮虽然被藏起来了,但是导出的接口却照样能访问到,那就说明权限这一块只做了一半,实际上跟没做差不多。
3、最后检查一下导出的日志
最好能把用户是谁、导出了哪张报表、用的是哪种导出格式、导出动作发生在什么时间,还有最后处理的结果是成功还是失败,都完整地记到日志里面去。这样万一哪一天突然发生了敏感数据被误导出的情况,才能顺着这些日志,快速地倒查出来问题到底出在哪个环节。
总结
用DevExpress Document Viewer来导出PDF,最简单的路径就是从前端的【Export To】菜单里选【PDF File】来完成,同时也可以在服务端直接生成文件。到了限制导出权限这一步,就要分成三个层次来做:第一步是在格式列表里把不需要的格式先藏掉;第二步是按照角色把导出工具栏入口整个控制住;第三步则是务必要在服务端,对报表、文档还有导出结果都再做一次校验。只有当前端和后端的限制同时起了作用,查看报表和下载报表这两种权限,才算是真正被分开了。
