PowerBI官方文档建议在配置权限表时,尽量使用一个角色授予所有用到的权限,在这里先不讨论如何建立一个角色配置所有的权限。在这里我们先讨论多角色的情景,当我们建立一个具有多个角色的模型时,某些用户同时出现在了多个角色,这个时候RLS呈现的结果是什么样的?
这里有一份成绩表,包括班级,科目,成绩三列,然后我们有不同的老师负责不同的科目及班级。举一个比较符合现实意义的情景:
每个班级都会有一个班主任,该老师负责教某一门课。比如 李四老师为二班的班主任,但是他还教所有班级的数学,意味着李四老师不仅能看到二班所有科目的成绩,他还能看到所有班级的数学的成绩,这就符合是一个用户出现了多个角色中。
权限表_科目:

权限表_班级:

建立的模型如下:

很不凑巧,我们建立的模型权限表与维度表之间的关系是1对1,所以我们可以不用开双向安全筛选器。
我们看看,当李四老师访问报表时,他能看到的内容是哪些?

他能看到二班的所有科目的成绩及所有班级的数学成绩,这符合我们的预期 ,即:当用户分配到多个角色,其RLS是累加的(取并集)
注意到,上述案例中的权限表与维度表之间的关系是一对一,没有开启安全双向筛选器,当开启安全双向筛选器后,会是什么样的结果?
为了方便,在这里我仅仅修改了一对一关系为多对一关系,并开启双向安全筛选器,我们还是看看李四老师能够访问的内容:

提示的错误,当使用安全双向筛选器时,不支持同一用户出现在多个角色中,这个时候该咋办呢?
在这里,我们提到了如何在不利用双向安全筛选器如何实现RLS
先看数据模型,权限表与维度表之间不再有关系,所以也就不必再开启双向安全筛选器

将RLS的Filter分别放在科目表和维度表上,其DAX如下:
用于筛选班级表的DAX:var accessCls =CALCULATETABLE(VALUES('权限_班级'[拥有的权限]),'权限_班级'[账户名称] = USERPRINCIPALNAME())ReturnOR('班级表'[班级] in accessCls, "ALL" in accessCls)
用于筛选科目表的DAX:
var accessCls =CALCULATETABLE(VALUES('权限_科目'[拥有的权限]),'权限_科目'[账户名称] = USERPRINCIPALNAME())Return'科目表'[科目] in accessCls
这时我们再看看李四老师能够访问的报表内容,这符合我们的预期了

到这里,我们可以总结以下结论:
1. 如果一个用户同时出现在两个角色中,用户能看到的内容是并集,不是交集
2. 如果一个用户出现在多个角色中,开启双向安全筛选器可能会出现意外结果,甚至是错误。
3. 在配置RLS时,不要忘记我们可以不通过关系设置行Filter
PowerBI的权限设置还是比较灵活的,对于本文讨论的问题,我还没有进行更深入的研究,如果你有类似的见解或者疑问,欢迎与我交流
后台回复:多角色,获取相关案例链接
好了,我是BISeven,欢迎批评指正




