暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

当一个用户出现在多个角色中时,RLS如何工作的?

BISeven 2021-09-30
557

PowerBI官方文档建议在配置权限表时,尽量使用一个角色授予所有用到的权限,在这里先不讨论如何建立一个角色配置所有的权限。在这里我们先讨论多角色的情景,当我们建立一个具有多个角色的模型时,某些用户同时出现在了多个角色,这个时候RLS呈现的结果是什么样的?

 

这里有一份成绩表,包括班级,科目,成绩三列,然后我们有不同的老师负责不同的科目及班级。举一个比较符合现实意义的情景:

 

每个班级都会有一个班主任,该老师负责教某一门课。比如 李四老师为二班的班主任,但是他还教所有班级的数学,意味着李四老师不仅能看到二班所有科目的成绩,他还能看到所有班级的数学的成绩,这就符合是一个用户出现了多个角色中。

权限表_科目:

 

 

权限表_班级:

 

建立的模型如下:

 

 

很不凑巧,我们建立的模型权限表与维度表之间的关系是1对1,所以我们可以不用开双向安全筛选器。

 

我们看看,当李四老师访问报表时,他能看到的内容是哪些?

 

他能看到二班的所有科目的成绩及所有班级的数学成绩,这符合我们的预期 ,即:当用户分配到多个角色,其RLS是累加的(取并集)

 

注意到,上述案例中的权限表与维度表之间的关系是一对一,没有开启安全双向筛选器,当开启安全双向筛选器后,会是什么样的结果?

 

为了方便,在这里我仅仅修改了一对一关系为多对一关系,并开启双向安全筛选器,我们还是看看李四老师能够访问的内容:

提示的错误,当使用安全双向筛选器时,不支持同一用户出现在多个角色中,这个时候该咋办呢?


在这里,我们提到了如何在不利用双向安全筛选器如何实现RLS

 

先看数据模型,权限表与维度表之间不再有关系,所以也就不必再开启双向安全筛选器

 

将RLS的Filter分别放在科目表和维度表上,其DAX如下:

用于筛选班级表的DAX:
var accessCls =
CALCULATETABLE(VALUES('权限_班级'[拥有的权限]),
'权限_班级'[账户名称] = USERPRINCIPALNAME())
Return
OR('班级表'[班级] in accessCls, "ALL" in accessCls)


用于筛选科目表的DAX:

var accessCls = 
CALCULATETABLE(VALUES('权限_科目'[拥有的权限]),
'权限_科目'[账户名称] = USERPRINCIPALNAME())
Return
'科目表'[科目] in accessCls


 

这时我们再看看李四老师能够访问的报表内容,这符合我们的预期了

 

到这里,我们可以总结以下结论:

1. 如果一个用户同时出现在两个角色中,用户能看到的内容是并集,不是交集

2. 如果一个用户出现在多个角色中,开启双向安全筛选器可能会出现意外结果,甚至是错误。

3. 在配置RLS时,不要忘记我们可以不通过关系设置行Filter

 

PowerBI的权限设置还是比较灵活的,对于本文讨论的问题,我还没有进行更深入的研究,如果你有类似的见解或者疑问,欢迎与我交流


后台回复:多角色,获取相关案例链接


好了,我是BISeven,欢迎批评指正

文章转载自BISeven,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论