页面树结构
转至元数据结尾
转至元数据起始

正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史

« 前一个 版本 19 下一个 »

背景说明

现客户的业务系统中,需要实现不同机构的用户查看报表时,只能查看所属机构以及下级机构的数据。

1.其中,机构相关的层级如下:

省联社(第一级)-》 市联社(第二级) -》区支行(第三级)

 

机构表为perm_inst,表结构如下:

 

数据如下:

 

2.数据表为perm_data,表数据如下:

以上数据在本示例中都存储于MySQL数据库中,接下来我们来实现数据权限控制。

 

实现步骤

一、创建用户

在smartbi中,创建用户组和用户,其中用户组的名称与业务数据中的机构信息一致。如下:

二、设置数据权限

接下来在进行数据权限的设置,有三种方式进行设置。如下:

方式一:简单参数实现方式

在所有报表上增加“选择机构_ALL”参数,该参数为多选参数,根据当前登录用户的机构信息,可下拉选择该用户的机构及下属机构进行数据的查看。

优点:实现较简单

缺点:机构参数中不存在层级的关系,并且机构的显示顺序有可能是无序的

 

设置步骤如下:

1.创建参数

(1)创建一个下拉框参数,参数名称为“选择机构_ALL”,数据类型为“字符串”,控件类型为下拉框

 

(2)勾选“允许多选”

 

(3)备选值设置为

select INST_NAME from perm_inst where INST_NAME=CurrentUserDefaultDepartmengName() or INST_NAME1=CurrentUserDefaultDepartmentName() or INST_NAME2=CurrentUserDefaultDepartmentName() or INST_NAME3=CurrentUserDefaultDepartmentName()

(本sql仅为示例参考,实际sql需要根据自己的机构逻辑进行设置)

其中 为系统函数,获取当前用户默认所属组的名称,然后与INST_NAME、INST_NAME1、INST_NAME2、INST_NAME3几个字段进行过滤,查询出当前用户默认所属组的机构及所有下级机构

 

以“广州联社”机构下的用户登录为例,备选值结果如下:

 

(4)默认值设置为:select INST_NAME from perm_inst where INST_NAME=CurrentUserDefaultDepartmentName()

该语句获取当前登录用户的所属机构

(也可以根据实际需要编辑sql,获取当前登录用户的所属机构和所有下级机构)

 

2.参考数据权限设置中,在报表的数据集、业务主题过滤器等相关资源中,使用该参数即可。以数据集为例,使用该参数如下:

 

方式二:级联方式实现

使用一个“选择层级”参数,选择用户可查看的机构层级,比如市联社、区支行,选择后,在后面的“选择机构_级联”参数中,可以选择用户权限内的对应层级机构进行数据的查看。

优点:可以先选择层级,再选择机构,不同层级的机构不会掺杂在一起

缺点:不可同时查看不同层级的机构数据

 

设置步骤如下:

1.新建用户属性

在资源定制->公共设置->用户属性节点下,新建用户属性“用户机构层级”,通过当前登录用户的默认所属组,从业务库的机构表中,获取该用户组(也即用户的所属机构)的层级。定义如下:

根据用户所属机构信息,从机构表中查询该字段,返回的结果包含0,1,2

 

2.创建“选择层级”参数

(1)创建一个下拉框参数,名称为“选择层级”,控件为下拉框,如下:

 

(2)备选值设置为:

select T.name as name, T.alias as alias from (select distinct 0 as name, "省联社" as alias from perm_inst union select distinct 1 as name, "市联社" as alias from perm_instunion select distinct 2 as name,"区支行" as alias from perm_inst)T where T.name >=用户机构层级

(此SQL仅供示例参考,实际sql需要根据自己的机构逻辑进行设置)

该sql语句通过select distinct 0 as name, "省联社" as alias from perm_inst union select distinct 1 as name, "市联社" as alias from perm_instunion select distinct 2 as name,"区支行" as alias from perm_inst,将用户的三个层级查询出来

 

然后再通过外套的一层sql语句,select T.name as name, T.alias as alias from (XXX XXX) T where T.name >=用户机构层级,查询出用户的机构和下级机构的层级。比如用户的机构是“广州联社”,则根据这段sql查询出来的机构层级有1和2

 

(3)默认值设置为:

select T.name as name, T.alias as alias from (select distinct 0 as name, "省联社" as alias from perm_inst union select distinct 1 as name, "市联社" as alias from perm_instunion select distinct 2 as name,"区支行" as alias from perm_inst)T where T.name =用户机构层级

该sql与备选值的sql是一致的,只是将最后的T.name>=用户机构层级修改为T.name=用户机构层级,只查询出用户的机构的层级,而不查询其下级机构的层级

 

(4)点击下一步,设置备选值和默认值的真实值为“name”字段,备选值和默认值的显示值为“alias”字段

 

3.创建“选择机构_级联”参数

(1)创建一个下拉框参数,名称为“选择机构_级联”,控件类型为下拉框

(2)勾选‘允许多选’

 

(3)备选值设置为:

select INST_NAME  from perm_inst where INST_level= 选择层级(参数) and (INST_NAME= CurrentUserDefaultDepartmentName() or INST_NAME1= CurrentUserDefaultDepartmentName() or INST_NAME2= CurrentUserDefaultDepartmentName() or INST_NAME3= CurrentUserDefaultDepartmentName() )

(此SQL仅供示例参考,实际sql需要根据自己的机构逻辑进行设置

通过上述的SQL,结合实际业务的机构表,先将“选择层级”中对应的INST_LEVEL的INST_NAME查询出来,并且根据后面的INST_NAME= CurrentUserDefaultDepartmentName() or INST_NAME1= CurrentUserDefaultDepartmentName() or INST_NAME2= CurrentUserDefaultDepartmentName() or INST_NAME3= CurrentUserDefaultDepartmentName()条件,将用户所属机构所选层级的机构或下级机构查询出来

 

(4)默认值设置为:

select INST_NAME  from perm_inst where INST_level= 选择层级(参数) and (INST_NAME= CurrentUserDefaultDepartmentName() or INST_NAME1= CurrentUserDefaultDepartmentName() or INST_NAME2= CurrentUserDefaultDepartmentName() or INST_NAME3= CurrentUserDefaultDepartmentName() ) limit 1

此SQL与备选值的SQL是一致的,只是增加一个limit 1,限制默认值只查询1个机构。

 

 

 

 

几种情况:

1.参数中直接包含所有的机构

2.先选择层级,再下拉选择对应层级的机构

3.下拉树参数

(可以做到)

  • 无标签