...
背景说明
现客户的业务系统中,需要实现不同机构的用户查看报表时,只能查看所属机构以及下级机构的数据。
...
省联社(第一级)-》 市联社(第二级) -》区支行(第三级)
机构表为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.新建用户属性
机构表如下:
实现步骤:
几种情况:
1.参数中直接包含所有的机构
2.先选择层级,再下拉选择对应层级的机构
3.下拉树参数
...
在资源定制->公共设置->用户属性节点下,新建用户属性“用户机构层级”,通过当前登录用户的默认所属组,从业务库的机构表中,获取该用户组(也即用户的所属机构)的层级。定义如下:
根据用户所属机构信息,从机构表中查询该字段,返回的结果包含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个机构。
4.参考数据权限设置中,在报表的数据集、业务主题过滤器等相关资源中,使用该参数即可。以数据集为例,使用该参数如下:
方式三:使用下拉树参数实现
通过将机构信息构成树的形式,并控制根节点为用户所属即可,可以实现数据权限的控制。
优点:机构层级选择清晰,接受度高
缺点:数据需要能够构造父子结构,实现较复杂
设置步骤如下:
1.新建用户属性
在资源定制->公共设置->用户属性节点下,新建用户属性“用户机构层级”,通过当前登录用户的默认所属组,从业务库的机构表中,获取该用户组(也即用户的所属机构)的层级。定义如下:
根据用户所属机构信息,从机构表中查询该字段,返回的结果包含0,1,2
2.创建下拉树参数
(1)在创建下拉树参数之前,请先参考演示下拉树参数示例,了解下拉树参数控件设置
(2)创建下拉树参数,名称为“选择机构_下拉树”,控件类型为“下拉树”
(3)勾选“允许多选”
(4)结合perm_inst表,先设置根节点为:
select distinct INST_NAME from perm_inst where INST_NAME= CurrentUserDefaultDepartmentName()
使用该sql,查询出用户的机构
(5)再设置默认值为:
select inst_name ,'0' as inst_name_P from perm_inst where inst_name= CurrentUserDefaultDepartmentName()
该sql语句,查询出用户的机构。由于下拉树参数需要构成父子结构,并且不可以存在子节点和父节点值相同(会造成死循环)的情况,所以需要增加'0' 作为父节点数据
(6)设置备选值为:
select inst_name ,'0' as inst_name_P from perm_inst where inst_name= CurrentUserDefaultDepartmentName()
union
select inst_name,inst_name1 as inst_name_P from perm_inst where 用户机构层级(用户属性)=0 and inst_level=1 and inst_name1= CurrentUserDefaultDepartmentName()
union
select inst_name,inst_name2 as inst_name_P from perm_inst where ( 用户机构层级(用户属性) =0 and inst_level=2 and inst_name1= CurrentUserDefaultDepartmentName()) or ( 用户机构层级 =1 and inst_level=2 and inst_name2=CurrentUserDefaultDepartmentName())
(此SQL仅供示例参考,实际sql需要根据自己的机构逻辑进行设置)
该sql通过3个select语句 union到一起,查询出用户的所有机构,并找到其父机构。以构造成父子关系,形成下拉树
其中,
select inst_name ,'0' as inst_name_P from perm_inst where inst_name= CurrentUserDefaultDepartmentName(),获取当前机构,并为了不造成死循环,设置'0'为父机构
select inst_name,inst_name1 as inst_name_P from perm_inst where 用户机构层级(用户属性)=0 and inst_level=1 and inst_name1= CurrentUserDefaultDepartmentName(),当用户机构所属层级为0(即省联社)时,获取下级机构
select inst_name,inst_name2 as inst_name_P from perm_inst where ( 用户机构层级(用户属性) =0 and inst_level=2 and inst_name1= CurrentUserDefaultDepartmentName()) or ( 用户机构层级 =1 and inst_level=2 and inst_name2=CurrentUserDefaultDepartmentName()),当用户机构所属机构为1(即市联社)时,获取下级机构
由于第三级机构为区机构,没有下级机构,并且通过第一个select语句已经能够查询出区机构,因此不必再设置
(7)设置备选值、默认值、根节点等设置如下:
3.参考数据权限设置中,在报表的数据集、业务主题过滤器等相关资源中,使用该参数即可。以数据集为例,使用该参数如下: