PowerBI中的权限一般指的是数据权限(RLS),RLS可以保护数据模型,限制给定用户的数据访问权限。RLS通过角色为指定的表格(理想情况是维度表)添加Row Filter,从而达到不同用户拥有不同的权限。
通常情况下,访问报告的人可能会按照人员等级(销售条线), 产品(市场条线), 地理信息等等多种业务角色,针对这种情况,我们一般会根据不同业务角色配置多张权限表,分别给对应的表格添加Row Filter来实现RLS。
比如,我们有一份成绩的数据模型,成绩表记录了各个班级各科目的成绩,我们假设每位老师具有不同的权限,有的老师是按科目看成绩,有的老师是按班级看成绩,针对这份模型,我们可以建立两张权限表:班级_权限表和科目_权限表。

我们可以看到,张三老师的权限是一班和二班的成绩

我们可以看到,权限_表和维表之间的关系是多对一,所以要开启“应用双向安全筛选器”。
到这里,我们可以思考一个问题,如果不开启“应用双向安全筛选器”,那我们该如何实现RLS呢?
当我们不开启"应用双向安全筛选器"时,我们的权限表会被RLS筛选,但是不会通过多对一的关系传递到维度表上,既然这样,那我们可不可以直接通过角色筛选维度表呢,进而再通过一对多的关系筛选事实表??
因为用户信息在权限表中,我们想要达到角色筛选维度表的目的,就要结合权限表直接在维度表上添加Row Filter 即可。
正如上述所分析,将以下两段DAX分别添加到班级表和科目表上:
// 筛选班级表:var accessCls =CALCULATETABLE(VALUES('权限_班级'[拥有的权限]),'权限_班级'[账户名称] = USERPRINCIPALNAME())Return'班级表'[班级] in accessCls// 筛选科目表:var accessCls =CALCULATETABLE(VALUES('权限_科目'[拥有的权限]),'权限_科目'[账户名称] = USERPRINCIPALNAME())Return'科目表'[科目] in accessCls

通过此种方式设置的RLS结果,张三老师看到的同样是一班和二班的成绩。说明我们的设置生效了

在未开启“应用双向安全筛选器"的情景下,数据模型最大的改变就是:权限表与维度表之间不再需要关系了(当然了,有也没有关系)。

总结
1. 通过上述的列子,可以更好的理解双向安全筛选器的作用是将RLS利用双向安全筛选器通过多对一进行传递。
2. 通过上述的例子,我们可以知道权限表与维度表之间不一定要有关系,这让我们在配置权限时有了更多的选择,有了更大的灵活性。
3. “应用双向安全筛选器”在某些情况下,使我们在配置权限时变得更简单。
参考:
1. https://xxlbi.com/blog/configuring-all-access-with-dynamic-row-level-security/
2. White Paper : Securing the tabular BI Semantic mode
3. PowerBI 企业级权限控制全动态终极解决方案 - 知乎 (zhihu.com)
下载相关资料及数据模型:
公众号后台回复:RLS,获取下载链接




