查表、字段这类基础可视权限,通常是DQL Server为不同用户配置对应的可视文件实现权限控制。在此基础上,NLQ JDBC也提供了动态切换DQL角色,可以直接在NLQ JDBC连接配置信息中传入指定的DQL用户名和密码完成身份指定。
针对智能问数页面的权限控制场景,除了使用前面介绍的NLQ JDBC动态切换DQL角色,还可以借助ChatBI的内置接口实现权限调整,全程无需重启服务即可完成当前登录用户的身份变更。下面我们就详细介绍这套动态权限切换的完整实现步骤。
第一步:安装开源BI安装包
润乾报表官网下载地址:https://www.raqsoft.com.cn/download/download-jsbb
解压开源BI安装包,将安装包demo 应用中的内容全部集成到已安装的润乾报表WEB 应用中,demo应用路径为 [安装根目录]\report\web\webapps\demo。
第二步:准备可视文件
以报表[安装根目录]\report\services目录下的orders服务为例,使用元数据编辑设计器,打开报表[安装根目录]\report\services\orders\conf目录中的可视文件orders.lmd,点击菜单栏系统 – 生成可视编辑 生成可视文件,为ORDERS表添加条件可见表达式,如下图:

表达式使用DQL宏,宏的语法为${宏名称}。
将编辑后的可视文件保存到报表[安装根目录]\report\services\orders\conf目录,命名为orders.vsb。
第三步:编辑宏文件
在宏文件中定义角色对应的宏和宏值,文件名可自定义。文件内容为json字符串,格式为:{"角色名":{"宏名":"字段值"}}。
新建宏文件macros.json,文件编码为UTF-8,内容如下:
{"guest1":{"EMPLOYEEID":"1"},"guest2":{"EMPLOYEEID":"2"}}
将编辑好的macros.json文件同样保存到orders服务的conf目录下:

第四步:修改service.xml
修改报表[安装根目录]\report\services\orders目录下的service.xml。
在<SERVICE>节点里添加宏文件定义,并在<USERS>节点里定义角色和可视文件。

第五步:添加DQL数据源
打开报表 [安装根目录]\report\web\webapps\demo\WEB-INF\raqsoftConfig.xml文件,添加名为guestDataLogic1的DQL数据源配置。

注意:数据源中的user、宏文件中的角色名以及service.xml中USER的name配置项三者一一对应。
第六步:配置智能问数页面默认DQL数据源
在[安装根目录]\report\web\webapps\demo\WEB-INF\classes\nlqConfig.xml中配置NLQ JDBC使用的DQL数据源,具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Config version="1">
<NLQList>
<NLQ name =" nlqOrder">
<DB> guestDataLogic1</DB>
<MetaData>dql\orders.nlq</MetaData>
<RaqsoftConfig>raqsoftConfig.xml</RaqsoftConfig>
</NLQ>
… …
</Config>
第七步:添加NLQ JDBC数据源
打开报表 [安装根目录]\report\web\webapps\demo\WEB-INF\raqsoftConfig.xml文件,添加名为NLQ4Orders的NLQ数据源配置,报表安装包中已默认预置该数据源,数据源名称不可修改,无需重复创建。
<DB name="NLQ4Orders">
<property name="url" value="jdbc:datalogic:nlq://?home=mql_home&nlq=nlqOrder "/>
<property name="driver" value="com.nlq.datalogic.jdbc.NLQDriver"/>
</DB>
第八步:动态切换用户
实际业务场景中,通常由对接的应用系统主动提供当前登录用户的身份信息,系统就能基于这个登录用户的身份,精准限定该用户可访问的数据源范围。接下来我们以智能问数应用作为实操示例,通过给页面传入不同的用户身份参数,直观展示这套权限控制机制的实际运行效果。
启动内置的TOMCAT和DQL Server。
通过http://localhost:6868/demo/raqsoft/dql/jsp/dqlSearch.jsp?dataSource=NLQ4Orders访问智能问数页面,默认使用guest1角色的数据源guestDataLogic1,使用搜索词查询ORDERS表中的销售数据(注:安装包已预先在词典orders.nlq中定义了ORDERS表的宏字段和实体词):


访问智能问数页面,查询订单数据如下图:

此时查看DQL Server控制台, DQL语句:
SELECT table_alias_name_0.ORDERID AS "订单编码",table_alias_name_0.SIGNDATE AS "签单日期",table_alias_name_0.SHIPDATE AS "发货日期",table_alias_name_0.RECEIVEDATE AS "收货日期",table_alias_name_0.AMOUNT AS "订单金额",table_alias_name_0.EMPLOYEEID AS "销售" FROM ORDERS AS table_alias_name_0
SQL语句:
SELECT T_1."ORDERID" "订单编码",T_1."SIGNDATE" "签单日期",T_1."SHIPDATE" "发货日期",T_1."RECEIVEDATE" "收货日期",T_1."AMOUNT" "订单金额",T_1."EMPLOYEEID" "销售" FROM ORDERS T_1 WHERE T_1."EMPLOYEEID"=1
从最终生成的SQL语句中,可以清晰看到DQL宏的自动替换效果,系统自动追加了对应角色的雇员ID过滤条件。
智能问数页面,使用guest2角色查询ORDERS表数据,如下图:

DQL Server控制台可以看到DQL语句:
SELECT table_alias_name_0.ORDERID AS "订单编码",table_alias_name_0.SIGNDATE AS "签单日期",table_alias_name_0.SHIPDATE AS "发货日期",table_alias_name_0.RECEIVEDATE AS "收货日期",table_alias_name_0.AMOUNT AS "订单金额",table_alias_name_0.EMPLOYEEID AS "销售" FROM ORDERS AS table_alias_name_0
宏替换后的SQL语句:
SELECT T_1."ORDERID" "订单编码",T_1."SIGNDATE" "签单日期",T_1."SHIPDATE" "发货日期",T_1."RECEIVEDATE" "收货日期",T_1."AMOUNT" "订单金额",T_1."EMPLOYEEID" "销售" FROM ORDERS T_1 WHERE T_1."EMPLOYEEID"=2
说明:
l NLQ JDBC支持使用嵌入式DQL JDBC完成连接,无需额外部署独立的DQL服务
l NLQ JDBC连接串中配置的DQL角色权限,与JSP页面传入的权限参数,只能二选一配置使用