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

如何用一张权限表实现多角色的RLS功能?

BISeven 2021-10-01
711

关于RLS的文章已经写了有好多了,包括:

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

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

3. 当一个用户出现在多个角色中时,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
// 只要班级表中的任何一列满足以下两个调价之一,那么该班级就会返回True
OR(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
// 只要班级表中的任何一列满足以下两个调价之一,那么该班级就会返回True
OR(OR(ITEMS IN ACCESSITEMS, UserRole = "ALL"), "ALL" IN ACCESSITEMS )


 

 

看着DAX的行数挺多的,其实两段代码的逻辑是一致的:

1. 如果权限表中的角色列为ALL,那么该用户能查看班级表和科目表的所有数据,即全权限

2. 如果权限表中的班级或者科目为ALL,那么该用户能查看班级或者科目表的所有数据

3. 如果权限表中的班级或者科目不为ALL,那么该用户能查看对应的班级表和科目表中的记录


注意:在一张角色权限表中的多列之间取的是交集。

 

例如柳宗元能看到的数据是一班的数学成绩

这样利用一张权限表去设置RLS,只用维护这一张excel表格就能够实现RLS的设置,不用在修改service端的设置,这张表格交给任何一个同事都能自主的维护。

 

如果,这篇文章有幸被你读到了,而且你也采用了该方式,在使用过程中出现任何问题欢迎与我进行交流

 

回复:onetable , 获取案例链接

 

好了,我是BISeven,欢迎与我进行交流


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

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


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

评论