查询分析的权限控制是通过制定.vsb(可视文件)实现的,对于不同的用户可以配置不同的可见文件,使他们在登录WEB后拥有不同的访问权限。
产品中默认提供的查询/分析示例界面,不具备用户权限系统。客户把查询页面引入到自己的系统后,需要在jsp中通过设置Tag属性值或者添加JS API为不同用户设置各自的可视文件,达到权限控制的目的。
分析控件通过JS API设置可视文件,更多JS API的介绍可参考JS API控制初始化界面小节:
<script>
guideConf.vsb="demo.vsb ";
</script>
查询控件通过Tag标签设置可视文件,Tag属性详细介绍请参考《程序员参考》查询分析控件:
<raqsoft:detailQuery
visibility="demo.vsb" //为查询控件设置需要使用的vsb可视文件
… …
/>
下面以查询控件为例,用实际场景介绍查询控件权限控制,同理,分析控件也一样,都是动态传值为不同的用户传递不同的可视文件,只不过查询控件是传到Tag标签属性,而分析控件是传到JS API。
查询控件示例:
假如客户系统中有两个用户root和guest。root用户权限最大,可以查询全部指标;guest用户只有部分权限:只能查看个别表的指标。那么我们就可以通过使用变量传递不同的Tag属性值达到权限控制的目的。
java代码判断,如果当前用户是root则通过Tag属性传递如下值:
String visibility= request.getParameter( " visibility" );
visibility = "root.vsb";//root.vsb:对元数据中的所有表都可见
如果当前用户是guest则通过Tag属性传递如下值:
String visibility = request.getParameter( " visibility" );
visibility= "guest.vsb";//guest.vsb:仅对元数据中的订单表、产品类别和产品表可见
<raqsoft:detailQuery
qyx="<%=qyx %>"
dataSource="<%=dataSource %>"
dictionary=""
visibility="<%=visibility %>"
/>
root用户的查询页面demo如下图:
guest用户的查询页面demo如下图:
产品自带的查询/分析控件jsp示例为:
查询控件:[安装根目录]\report\web\webapps\demo\raqsoft\guide\jsp\qyx.jsp
分析控件:[安装根目录]\report\web\webapps\demo\raqsoft\guide\jsp\olap.jsp
通过上一节的学习我们了解到权限控制就是对不同用户使用不同的vsb可视文件。假如有这样一个销售场景,在多维分析中需要让每个员工只能查询自己的订单情况,这样一来有N个销售代表就要做N份可视文件,制作起来费时费力,有没有什么简单的方法可以不用制作这么多可视文件也能实现这种权限控制呢?
当然,下面就来用“DQL宏”解决这个问题。
在vsb可视文件中为订单表添加条件可见表达式。表达式支持使用DQL宏,宏的语法为${宏名称}。宏只能用在条件可见里,其中宏名称就是${}中变量名称;宏值就是${}里面变量的值。
如下图所示,为订单表添加条件可见表达式:
在可视文件条件可见中添加DQL宏表达式后,接下来就要为DQL宏传值了。
多维分析集成到应用系统后,通常由应用系统负责提供当前登录用户的信息,比如将用户信息从session中传递过来。本例为了演示,直接在jsp写了固定的宏值,需要手动改这个值来模拟不同登录用户。
在多维分析的JSP文件中添加脚本,传递宏值。
test.jsp内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.raqsoft.guide.web.*" %>
<%@ page import="com.raqsoft.guide.util.*" %>
<%@ page import="java.util.*" %>
<%@ page import="com.raqsoft.guide.resource.*" %>
<%@ taglib uri="/WEB-INF/raqsoftAnalyse.tld" prefix="raqsoft" %>
<%
//在session中设置DQL表的权限条件
ArrayList filters = new ArrayList();
session.setAttribute("_raqsoft_filters_",filters);
DQLTableFilter f = new DQLTableFilter("default","DataLogic");
filters.add(f);
f.setVsb("demo.vsb",request); //指定用…/WEB-INF/files/dql/demo.vsb
f.getParamValues().put("雇员","3"); //为条件可见中的DQL宏传递宏值
%>
<raqsoft:analysev2
dataSource="DataLogic"
fixedTable="订单"
/>
访问上面新建的多维分析页面test.jsp,查询订单表中的指标,报表中展现出了雇员ID为3的订单信息:
雇员字段有显示值设置。
多维分析页面中拖拽订单表的指标时,会自动在DQL语句后拼上条件可见表达式,如:
SELECT * FROM 订单 where 雇员ID = ${雇员}
假设雇员为“李芳”,从登录的session界面获取到雇员值为”李芳“,李芳的雇员ID为3,然后将宏值3传递进去:最终生成的DQL语句为:SELECT * FROM 订单 WHERE (雇员ID = 3)