关于RLS的文章已经写了有好多了,包括:
2.在使用PowerBI时不开启应用双向安全筛选器的情况下该如何实现RLS?
上面的文章介绍了RLS的传递方向,双向安全筛选器的作用,如何在不使用双向安全筛选器的情况下实现RLS,那今天这篇文章看一看如何使用一张权限表实现多角色的RLS功能,使用一张权限表的最大好处是方便维护,尤其是在用户离职或者转岗的情况下,我们不用在Service端去调整了,只要我们调整我们的权限表就ok了,还有一个好处就是我们可以更深入的理解PowerBI中RLS是如何进行工作的;当然了,有好处就有坏处,权限设置的DAX稍微复杂了一点,但是只要理解了就会很简单,而且在后期的维护过程中会带来巨大的收益。
废话不多讲了,我们直接看模型吧:

为了说明如何使用一张权限控制表实现多角色的RLS的实现原理,模型比较简单,整个模型表达的是不同的老师可以查看不同班级不同科目的成绩,我们的权限表设置如下:

权限控制表一共包含4列,账户名称即用户的邮箱ID,角色主要为了区分该用户是否是全权限(当然了你也可以不要这列,直接在班级和科目全写上ALL,这样可能会显得重复),接下来就是我们要保护的表格班级和科目,例如根据这张表我们就可以看出张三能查看的数据是一般,李白能查看的就是所有班级语文和数学的成绩,那杜甫就是全权限了。
那该如何实现RLS的设置呢?根据权限表我们主要想保护两张表格:班级和科目表,所以我们需要在班级表和科目表上添加Row Filter,即:
权限_班级 =// 首先判断他是不是全权限VAR vUser = USERNAME()// 迭代被保护的表格( 如果这段公式直接写在角色里面,直接引用该列即可VAR ITEMS = SELECTEDVALUE('班级表'[班级])// 该用户能够访问的权限表中的全部内容VAR ACCESS = FILTER('权限控制表2', vUser = '权限控制表2'[账户名称])// 读取角色列VAR UserRole = CALCULATETABLE(VALUES('权限控制表2'[角色]),ACCESS)// 读取班级列VAR ACCESSITEMS = CALCULATETABLE(VALUES('权限控制表2'[班级]),ACCESS)RETURN// 只要班级表中的任何一列满足以下两个调价之一,那么该班级就会返回TrueOR(OR(ITEMS IN ACCESSITEMS, UserRole = "ALL"), "ALL" IN ACCESSITEMS )
权限_科目 =// 获取该当前登录用户VAR vUser = USERNAME()// 迭代被保护的表格( 如果这段公式直接写在角色里面,直接引用该列即可VAR ITEMS = SELECTEDVALUE('科目表'[科目])// 该用户能够访问的权限表中的全部内容VAR ACCESS = FILTER('权限控制表2', vUser = '权限控制表2'[账户名称])// 读取角色列VAR UserRole = CALCULATETABLE(VALUES('权限控制表2'[角色]),ACCESS)// 读取科目列VAR ACCESSITEMS = CALCULATETABLE(VALUES('权限控制表2'[科目]),ACCESS)RETURN// 只要班级表中的任何一列满足以下两个调价之一,那么该班级就会返回TrueOR(OR(ITEMS IN ACCESSITEMS, UserRole = "ALL"), "ALL" IN ACCESSITEMS )
看着DAX的行数挺多的,其实两段代码的逻辑是一致的:
1. 如果权限表中的角色列为ALL,那么该用户能查看班级表和科目表的所有数据,即全权限
2. 如果权限表中的班级或者科目为ALL,那么该用户能查看班级或者科目表的所有数据
3. 如果权限表中的班级或者科目不为ALL,那么该用户能查看对应的班级表和科目表中的记录
注意:在一张角色权限表中的多列之间取的是交集。
例如柳宗元能看到的数据是一班的数学成绩

这样利用一张权限表去设置RLS,只用维护这一张excel表格就能够实现RLS的设置,不用在修改service端的设置,这张表格交给任何一个同事都能自主的维护。
如果,这篇文章有幸被你读到了,而且你也采用了该方式,在使用过程中出现任何问题欢迎与我进行交流
回复:onetable , 获取案例链接
好了,我是BISeven,欢迎与我进行交流
在使用PowerBI时不开启应用双向安全筛选器的情况下该如何实现RLS?




