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

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

1.

2.

3.

上面的文章介绍了RLS的传输方向、双向安全过滤器的作用以及如何在不使用双向安全过滤器的情况下实现RLS。 今天的文章我们就来看看如何使用权限表来实现多角色RLS。 功能上,使用权限表最大的好处就是方便维护,特别是当用户离职或者跳槽的时候。 我们不必在Service端进行调整。 只要我们调整一下我们的权限表就可以了。 另一个好处是我们可以更深入地了解RLS在PowerBI中的工作原理; 当然,有优点也有缺点。 权限设置的DAX稍微复杂一点,但是只要理解了就会很简单,在后期的维护过程中也会更容易。 带来巨大的效益。

废话不多说,我们直接看模型:

为了说明如何利用权限控制表实现多角色RLS的实现原理,模型比较简单。 整个模型表达了不同的老师可以在不同的班级查看不同科目的成绩。 我们的权限设置如下:

权限控制表共包含4列。 帐户名称是用户的电子邮件 ID。 作用主要是区分用户是否拥有完全权限(当然也可以省略这一列,直接在class和subject中写ALL角色权限设计,可能会出现Repeat),接下来就是我们要保护的表class和subject。 比如根据这个表,我们可以看到张三能看到的数据是平均分,李白能看到的数据是各班的语文和数学成绩。 那么杜甫是完全许可的。

那么如何实现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,那么用户可以查看班级表和账户表中的所有数据3D场景,即完全权限

2.如果权限表中的班级或主题为ALL,则用户可以查看该班级或主题表中的所有数据

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

注意:在角色权限表中的多个列之间进行交集。

比如柳宗元能看到的数据是1班的数学成绩

这样就利用了一个权限表来建立RLS。 你只需要维护这个excel表格就可以实现RLS的设置。 无需修改服务端的设置。 该表可以由任何同事独立维护。

如果你有幸阅读到这篇文章角色权限设计,并且你也采用了这个方法,如果你在使用过程中遇到任何问题,欢迎随时与我交流。

HuiFu:onetable,获取案例链接

好的,我是BISeven,欢迎与我交流

文章来源:https://www.toutiao.com/a7018211039254774275/