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

在使用PowerBI时不开启应用双向安全筛选器的情况下该如何实现RLS?

BISeven 2021-09-23
610

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)

4. PowerBI中RLS是如何传播的?


下载相关资料及数据模型:

公众号后台回复:RLS,获取下载链接

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

评论