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

使用数据权限功能实现机构权限控制,即不同机构用户登录,打开同一张报表看到的只有其所属机构对应的数据。 以Cube 【Sales】为例,我们把Store维当做机构维,对于同一张多维分析:

  • 以超级管理员admin登录打开,可以看到所选的所有Store成员,如下图所示。

           

  • 以Store维的CA成员对应的用户test1登录打开,只能看到CA成员数据,如下图所示。

           

  • 以Store维的OR成员对应的用户test2登录打开,只能看到OR成员数据,如下图所示。

           

 

可以通过数据权限功能实现上例效果,下面我们通过映射设置简单设置等方式来讲述如何实现上例效果。

文档目录:

方式一:映射设置

1、新建多维分析。使用admin登录,使用Cube【Sales】新建多维分析保存在公共目录下,命名为"机构权限多维分析"。行上选择Store维的USA、CA、OR和WA成员;列上选择度量值成员。创建好后多维分析发布到浏览中。

2、新建两个用户组,其用户组名分别设置为CA和OR。

3、新建用户。在CA用户组下新建一个用户test1,设置其角色为普通角色;在OR用户组下新建一个用户test2,设置其角色为普通角色。

4、权限设置。把多维分析"机构权限多维分析"的查看权限赋给普通角色。

5、数据权限映射设置。打开 定制管理 -> 数据管理 -> 多维数据源节点

  • 选择多维数据源下的Cube【Sales】,右键选择 设置数据权限,进入数据权限设置界面。
  • 在【Sale】节点下找到Store维度的层次结构节点,右键选择 设置 选项。
  • 在右侧设置区选择映射设置。例外角色选择管理角色。映射关系设置为成员名称等于用户组名称。如下图: 

  • 点击右下角的保存按钮。

6、查看效果。分别使用admin、test1、test2用户登录打开"机构权限多维分析"查看效果。

 

方式二:简单设置

1、新建多维分析。使用admin登录,使用Cube【Sales】新建多维分析保存在公共目录,命名为"机构权限多维分析"。行上选择Store维的USA、CA、OR和WA成员;列上选择度量值成员。把此多维分析下发布到浏览中。

2、新建两个用户组,其用户组名分别设置为CA和OR。不赋任何角色。

3、新建用户。在CA用户组下新建一个用户test1;在OR用户组下新建一个用户test2。不赋任何角色。

4、新建角色。在CA用户组下新建一个角色test1;在OR用户组下新建一个角色test2。要求这两个角色权限设置为:其对应的用户可以打开"机构权限多维分析"浏览数据。其中角色test1赋给用户test1,角色test2赋给用户test2。

5、数据权限映射设置。打开 定制管理 -> 数据管理 -> 多维数据源节点

  • 选择多维数据源下的Cube【Sales】,右键选择 设置数据权限,进入数据权限设置界面。
  • 在【Sale】节点下找到Store维度的层次结构节点,右键选择设置选项。
  • 在右侧设置区选择简单设置。添加角色test1,设置其可见成员为CA;添加角色test2,设置其可见成员为OR。如下图:

  • 点击右下角的保存按钮。

6、查看效果。分别使用admin、test1、test2用户登录打开"机构权限多维分析"查看效果。

 

注意:如果用户有两个以上的角色,数据权限取的是用户所有角色数据权限的并集。

 

方式三:高级设置

1、在应用高级设置方式时,通常需要先创建一个用户属性,获取到当前用户所属的机构信息,用来设置合法性表达式。创建用户属性的过程,请参考用户属性章节

2、选择相应的多维数据集,右键选择 设置数据权限 ,在右侧设置界面上,找到对应的机构维。在其上点击右键菜单中的“设置”菜单项,然后做如下设置。 

3、其中的根节点表达式,使用 MDX 表达式的写法,返回用户所能访问的全部成员集合。可以参考如下示例写法。

filter( [分支机构].[分支机构].allmembers, (
    InStr("^A_当前用户所属机构^" ,  "," + [分支机构].[分支机构].CurrentMember.properties("KEY")+"," ) <> 0 
    or InStr("^A_当前用户所属机构^" ,  ",000" + [分支机构].[分支机构].CurrentMember.properties("KEY")+"," ) <> 0 )
)

4、合法性表达式用来判断根节点之下的所有节点,能否被当前用户访问。使用 MDX 表达式的写法,判断当前维成员的合法性。可以参考如下示例写法。

Count( StripCalculatedMembers( { [分支机构].[分支机构].CurrentMember } ) ) = 0 
Or Count( Filter( Ascendants(  [分支机构].[分支机构].CurrentMember ),  (
    InStr("^A_当前用户所属机构^" ,  "," + [分支机构].[分支机构].CurrentMember.properties("KEY")+"," ) <> 0 
    or InStr("^A_当前用户所属机构^" ,  ",000" + [分支机构].[分支机构].CurrentMember.properties("KEY")+"," ) <> 0 ) )
) > 0