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


本章节以实例介绍如何设置关系数据源的数据权限。

数据权限的用例,从应用场景上划分,可以分为以下几类:

1.用户进入系统,可以查看到所属机构的数据。

2.用户进入系统,可以查看到所属机构及下级机构的数据。

3.用户进入系统,可以查看到权限内的数据,这个权限可能指某些用户可以查看所属机构的数据,还可以查看另外一些机构的数据,并没有严格的规律。

4.用户进入系统,打开不同的报表,不同的用户可以查看到不同的数据。这是针对每一张报表而言,权限控制更为复杂。


数据权限的用例,从实现方式上划分,可以分为以下几类:

1.设置数据权限:通过在数据源、业务主题上设置数据权限实现。这种方式只针对:可视化数据集、即席查询、(基于数据源表或者业务主题)的透视分析、以及基于可视化数据集的其他报表生效。

2.sql中定义数据权限:由于sql数据集等无法直接使用数据源、业务主题上的数据权限设置,因此只能在sql中进行定义。

3.参数:通过控制参数的默认值、备选值来控制显示的数据。

4.用户属性:当数据权限比较复杂时,可以通过用户属性进行设置。

无论是哪种实现方式,在系统中我们都需要通过系统函数来获取当前用户的某些属性,比如用户所属组别名、用户名、用户别名、用户扩展属性等信息,然后结合上面的几种方式来实现。



下面我们会举出一些例子,从不同场景的数据权限,通过较合适的实现方式进行实现。

查看所在区域的数据

用例说明

演示数据:

在数据库中,有以下数据:

目标要求:

在业务需求中,我们的用户会有各自的结构,我们希望每个用户进入系统能够看到自己所属机构的数据。比如华南业务员进入系统,只能看到华南的数据。华东业务员进入系统,只能看到华东的数据。

实现步骤

1.创建用户组。

由于数据权限涉及到用户的相关信息,在考虑上面的数据权限需求时,需要先创建用户,那么得先创建用户组。由于不同机构下的用户需要看到自己所属机构的数据,那么考虑以机构来建立用户组。

在系统中先创建两个用户组。华南和华东用户组,如下:

其中,我们可以设置用户组的名称、编号或者别名之一与我们实际业务上的机构名称相同。此例中设置的是用户组名称。

2.创建用户。

在两个用户组下创建用户。分别是华南业务员和华东业务员。

3.设置数据权限-数据源

(1)找到业务需求中那张所属的数据源,更多操作 > 设置数据权限。

(2)控制不同机构用户看到所属区域的数据。需要对数据表t_freight中的c_region进行限制。找到表 t_freight更多操作 > 设置。接着点击 添加。

(3)在数据权限编辑器中,切换设置为 高级设置,设置表中字段 c_region=  CurrentUserDefaultDepartmentName()。

(4)范围定义中选择用户组“华南”和“华东”,适用于此范围。

(5)保存数据权限设置。此时基于此数据源建立的可视化数据集所制作的报表已经能够实现权限控制了。并且基于数据源创建的业务主题,以及基于此数据源或者此数据源上的业务主题创建的即席查询、透视分析也能够实现权限控制。

4.设置数据权限-sql

在系统中,还有一些报表是基于sql数据集等创建的。此步骤设置sql数据集以及原生sql数据集中的数据权限。

在报表对应的sql数据集或者原生sql数据集中,添加如下where语句:

T25.c_region = CurrentUserDedaultDepartmentName( ) or CurrentUserDefaultDepartmentName( ) not in ('华东','华南')

这个where 语句分两个部分:

(1)第一个部分是:T25.c_region = CurrentUserDefaultDepartmentName,这里对数据进行过滤,当用户登录时,会自动获取到用户的所属组名称,与数据中的c_region进行过滤,那么就会只显示用户的机构数据

(2)第二个部分是 or CurrentUserDefaultDepartmentName not in ('华东','华南') ,由于我们的示例是只对华东和华南用户进行限制,那么其他不应该受到限制的用户应该排除在外,因此需要加多这样一条语句。这条语句也可以变化为 or CurrentUserDefaultDepartmentName ='根组',那么就是根组下的用户不需要进行数据过滤.··· ···

查看所属机构及下级机构的数据

用例说明

在实际的业务需求中,机构是有层级的,现在我们需要实现的是不同用户登录进入系统之后,只能看到所属机构以及所有下级机构的数据。

机构层级,表:map_area2

实际数据,表:map_data2

接下来,我们需要实现。华南用户登录进入系统,可以看到华南、以及华南下属机构深圳、广州的数据;华东用户的登录进入系统,可以看到华东、以及华东下属机构上海、江苏的数据。

实现步骤

1.创建用户组。

由于数据权限涉及到用户的相关信息,在考虑上面的数据权限需求时,需要先创建用户,那么得先创建用户组。由于不同机构下的用户需要看到自己所属机构的数据,那么考虑以机构来建立用户组。

在系统中先创建好用户组。华南和华东用户组,以及其下的深圳、广州、上海、江苏用户组,如下:

其中,我们可以设置用户组的名称、编号或者别名之一与我们实际业务上的机构名称相同。此例中设置的是用户组名称。

2.创建用户。

在华南用户组和华东用户组下创建用户。分别是华南业务员和华东业务员。

3.设置数据权限

控制用户查看到所属机构及下级机构的数据,可以有三种实现方式。

第一种:考虑为所有的报表增加一个机构的下拉树参数,通过控制参数的根节点,来控制参数的下拉选项。使得用户选择此参数值时,只能选择所属机构或者下属机构,来筛选数据。

第二种:后通过系统函数中的CurrentUserAllDepartmentIDRecursively获取到用户所属于的所有机构的ID,然后和数据进行过滤

第三种:考虑将用户和用户组的对应关系,在数据库中维护一张表。通过用户属性,获取到当前用户名称到数据库中查询用户所能查看到的机构,再与数据进行过滤。

方式一

考虑为所有的报表增加一个机构的下拉树参数,通过控制参数的根节点,来控制参数的下拉选项。使得用户选择此参数值时,只能选择所属机构或者下属机构,来筛选数据。

1.在系统中创建一个下拉树参数。从机构层级表中获取数据。

机构层级表 map_area2

(1)参数备选值设置:select distinct c_area as c_area, c_parea as c_parea from map_area2。备选值直接查询出全部数据即可。

(2)参数默认值设置:select distinct c_area as c_area, c_parea as c_parea from map_area2 where c_area = CurrentUserDefaultDepartmentName() or (CurrentUserDefaultDepartmentName()='根组' and c_area='中国' )

这个sql语句分两部分:

第一部分是如果不是根组用户,也就是说这些用户需要过滤数据。所以默认值使用系统函数CurrentUserDefaultDepartmentName 与c_area进行过滤。则不同区域的用户登录时,此参数的默认值就是用户默认所属组名称了。也就是说当华南业务员登录时,这个参数的默认值是“华南”,当华东业务员登录时,这个参数的默认值是“华东”

第二部分,如果是根组下的用户,一般指管理员admin,那么默认值就直接是机构数的最顶级机构,“中国”好了。

(4)参数的根节点设置:select distinct c_area as c_area, c_parea as c_parea from map_area2 where c_area = CurrentUserDefaultDepartmentName() or (CurrentUserDefaultDepartmentName()='根组' and c_area='中国' )

我们通过下拉树来控制数据筛选,实际上就是控制用户 访问时,这个参数的根节点是什么。比如华南业务员登录,那么下拉树的根节点就需要是“华南”,华南业务员可以选择“华南”,也可以展开华南下面的机构,选择下级机构查看数据。

这个我们可以参考上面的sql定义来实现。上面的sql定义分为两部分:

第一部分是如果不是根组用户,也就是说这些用户需要过滤数据。所以根节点使用系统函数CurrentUserDefaultDepartmentName 与c_area进行过滤。则不同区域的用户登录时,此参数的根节点就是用户默认所属组名称,用户可以展开根节点下面的机构,进行过滤数据。也就是说当华南业务员登录时,这个参数的根节点是“华南”,他可以展开“华南”下的机构,进行数据的筛选。

第二部分,如果是根组下的用户,一般指管理员admin,那么根节点就直接是机构数的最顶级机构,“中国”好了。

(5)设置参数为多选,保存参数。

2.在所有数据集中,使用这个参数。

3.创建过滤器

对于即席查询或者可视化数据集,由于用户可以自由勾选条件和过滤器,有可能不会过滤数据。我们可以考虑创建一个过滤器,使用这个参数。并且设置这个过滤器“默认生效”以及“在分析界面隐藏”。

在数据源或者对应的业务主题下创建过滤器,并且勾选“默认生效”以及“在分析界面隐藏”。


报表的参数设置需要使用参数默认值。

通过这种方式,可以实现用户查看所属机构及其下属机构的数据。并且可以自由选择参数中的机构。

方式二

通过系统函数中的CurrentUserAllDepartmentIDRecursively获取到用户所属于的所有机构的ID,然后和数据进行过滤。

1.参考“查看所在区域的数据”,设置数据源、业务主题、sql的权限,并且将权限语句修改为 c_area in (CurrentUserAllDepartmentIDRecursively()).

数据源表:

2.在系统中,还有一些报表是基于sql数据集等创建的。此步骤设置sql数据集以及原生sql数据集中的数据权限。

在报表对应的sql数据集或者原生sql数据集中,添加如下where语句:

说明:通过CurrentUserAllDepartmentIDRecursively,会返回用户所属组及所有下属组的编号(注意这里返回的是用户组的编号,所以前面创建用户组的时候需要注意)。比如华南业务员登录,会返回 '华南','深圳','广州'这样的数据。在权限定义的sql中,需要手动在 系统函数 CurrentUserAllDerpartmentIDRecursively外加上括号。

方式三

考虑将用户和用户组的对应关系,在数据库中维护一张表。通过用户属性,获取到当前用户名称到数据库中查询用户所能查看到的机构,再与数据进行过滤。

1.创建用户机构映射表

在数据库中维护一张表,记录用户和可查看的机构。此例中创建的是permiss2。数据如下:

2.创建用户属性

在公共设置 > 用户属性节点下,新建用户属性“用户可看机构”,定义如下:

这个表达式先获取当前用户名,然后到permiss2表中查询用户可看的机构,并返回这些机构名称。

3.设置数据权限

参考“查看所在区域的数据”,设置数据源、业务主题、sql数据集的权限。并且将全选语句修改为c_area in 用户可看区域这个用户属性。

数据源表:

在系统中,还有一些报表是基于sql数据集等创建的。此步骤设置sql数据集以及原生sql数据集中的数据权限。

在报表对应的sql数据集或者原生sql数据集中,添加如下where语句:

查看权限内的数据

用例说明

查看权限内的数据,这种权限一般是指这样的场景:华南业务员进入系统,除了查看到华南及其下属机构深圳、广州的数据之外,还可以查看到华东的数据;华东业务员登录进入系统,可以看到华东及其下属机构上海、江苏的数据。存在这种跨机构的数据查询。又或者数据权限和用户组并没有直接的关联关系等

实现步骤

这种查看权限内的数据的方式,一般采用在数据库中维护权限表,并且通过用户属性来获取,设置其数据权限。

1.创建数据权限映射表

在数据库中创建一张权限映射表,记录用户名和用户可看的机构信息。此例中创建的表位permiss3。数据如下:

2.创建用户属性

在公共设置 > 用户属性节点下,创建用户属性“用户可看机构2”。表达式如下:

这个表达式先获取当前用户名,然后到permiss3表中查询用户可看的机构,并返回这些机构。

3.设置数据权限

参考“查看所属机构的数据”,设置数据源、业务主题、sql数据集的权限。并且将全选语句修改为c_area in 用户可看机构2 这个用户属性。

数据源表:

在系统中,还有一些报表是基于sql数据集等创建的。此步骤设置sql数据集以及原生sql数据集中的数据权限。

在报表对应的sql数据集或者原生sql数据集中,添加如下where语句:

自助分析的权限

在设置数据权限时,针对自助分析模块,也即即席查询和透视分析,因为用户可以自由勾选即席查询和透视分析中的字段,所以如果用户不勾选区域所在的表的字段时,我们在数据源、业务主题上设置的数据权限就不会生效,因为报表执行的sql中不会有机构所在的那张表。针对这种情况,我们可以通过以下方式实现。

1.创建过滤器

在过滤器中将区域字段与系统函数、用户属性、参数等相关联。

2.设置默认生效和在分析界面隐藏

勾选此过滤器的“默认生效”和“在分析界面隐藏”。

通过这种方式,可以实现无论用户如何操作即席查询和透视分析报表,由于过滤器始终生效,因此用户只能够查看权限内的数据。

参数的权限控制

对于参数,有时候也需要控制其显示的选项。比如“区域参数”,默认是显示所有区域选项。希望用户登录进来,只能选择权限内的区域。如何实现?

对于参数的权限控制,在数据源上设置的是不会生效的。可以在参数的备选值、默认值中进行设置。

可以直接select 系统函数

也可以在参数定义中使用系统函数等进行过滤。

在参数的定义中,一般也是需要对admin管理员进行例外设置。