首先,在PowerBIDesktop中进行设计,先设计一个权限表:

具体权限如下:

也就是说,这些用户账号在PowerBIService登录时,会分别代表这些用户,接下来会使用一个很重要的动态函数:USERNAME()来动态地获取当前登录的用户名,并设置角色的安全性如下:

这里的意思是:对于负责人角色,按照权限表来进行过滤,过滤的条件是[PowerBI账号] 在 { [用户 当前用户] }中。其中,[用户 当前用户]是度量值:

这样,在PowerBIDesktop端就完成了权限的设计,将这些内容发布到云端之前,云端需要一些准备。

首先,我们使用一个工作区来容纳我们的内容,并做基本的权限设定:

我们用三个用户来做演示:

  • 佐罗(bi@excel120.com),是管理员
  • 楚杰(chujie@excel120.com),是(普通)成员
  • 范彩(fancai@excel120.com),是(普通)成员

注意,管理员和成员有不同的权限:

  • 管理员,可以访问并编辑工作区内的内容。
  • 成员,只能查看工作区内的内容。

由于管理员可以编辑工作区内的内容,这个权限非常大,所以行级别安全性(RLS)对管理员是不起作用的,这也符合逻辑,因为管理员是发布PowerBI文件的人,也就是开发或设计PowerBI文件的人,他显然可以查看文件的任何内容,不然也无法发布。

因此,真正的权限控制的前提是针对成员进行的,需要将该工作区的用户全部作为成员添加,而不能赋予管理员的权限,且成员只能查看 Power BI 内容。

接着我们需要在云端的数据集进行设置,如下:

这样,我们就可以在某类角色下,把相关的用户装入进来,之前在Desktop中设置的安全性就可以生效了。

我们使用chujie@excel120.com登录来看看效果:

这是满足我们需要的。小结一下,我们可以发现这种方法是针对角色来设置行级别安全性,通过USERNAME函数动态获得用户名并对数据进行筛选,由于模型的关系会将筛选进行传递,使得特定的用户只能计算属于他的数据进而起到了数据隐私保护的作用。

自主全动态安全性控制

在上述的行级别安全性中已经解决了很多问题,可以应付N家门店店长加入店长角色后,就只能看到自己的数据计算。

问题来了,如果想给店长显示一个全局平均线怎么办,希望的效果如下:

就会发现上述的行级别安全性做法就不行了,因为在加载数据的时候已经过滤掉了所有不属于该用户的数据,如果再回头观察下刚刚的行级别安全性方法下的报告,会发现我的销售额全部销售额的值是一样的,及时用了ALL函数也无济于事。原因也是因为此,即只加载和此人权限有关的数据了,因此ALL的数据也只有这些数据,固结果是一样的。但这不是我们想要的,我们预期的效果要满足两点:

  • 能看到我的销售额(即:带权限的销售额)
  • 全局平均销售区域销售额来做参照对比

通过这样的分析,就发现不能使用行级别安全性来实现,因为这将过滤全部数据,只剩下一部分,也就无法计算全局结果。所以我们必须自主实现带权限的计算,并加载全部数据。

如果做一些实践,我们不难发现,行级别安全性的本质在于按照角色来过滤数据,其实数据集的全部数据并没有变化,既然如此,我们也可以自己来写带权限的度量值,达到一样的效果。例如,常规的销售额写法如下:

销售 销售额 = SUM( '订单'[销售额] )

而带权限的写法是:

销售 销售额 带权限 = CALCULATE( [销售 销售额] , FILTER( '权限表' , '权限表'[PowerBI账号] = [用户 当前用户] ) )

在这种写法下,我们并不需要设置行级别安全性,安全性由我们自己控制。我们反而需要关闭行级别安全性,以免受到影响,而实现了预期的效果。

用这种方法与行级别安全性来做个对比:

  • 本方法可以实现对当前用户权限控制,并计算非当前用户下的数据,更加灵活;而行级别安全性只能计算当前用户下的数据。
  • 本方法需要将报告中已经使用的度量值,全部换成加入权限控制的度量值,如果已经使用了几百个度量值,再全部替换,是一个很大的工作量;而行级别安全性不涉及对度量值的修改,没有额外工作量。

我们再次感受了有得必有失的无奈啊,行级别安全性和自主全动态安全性各有优劣,如果真的存在以下这种情况:

  • 有大量度量值,全部修改的工作量太大。
  • 必须要和全局度量值计算对比之类的需求,行级别安全性会过滤数据无法满足。

我们提供一个思路,可以同时解决上述两个问题,那就是:

  • 重复加载相关的事实表,让重复加载的事实表不受行级别安全性的影响。
  • 对需要特定处理的全局计算使用这些不受影响的事实表。

当然,解决了两个痛点的同时又带来了一个问题,那就是数据被重复加载了,导致了冗余,也算是一种不完美,在实际环境中,根据实际问题来权衡处理才是合适的。这里的讨论已经足够充分,可以应对不同的场景了。

控制可以展示的报告页面

以上的权限控制属于一套类型,或者说是一种角度。另一种角度,在PowerBI中是没考虑的场景,但在现实中却有这样的需求,那就是:不同的角色可以看到的页面数是不同的。例如:一份报告有10页,CEO可以看到所有页面;而区域负责人不能看到公司总体报告页面。也就是,不同的用户能显示或隐藏不同的页面。

很显然这个需求在PowerBI中默认又是无法做到的,这里给出一个思路,可以应对这种很有现实意义但又没有官方支持的场景。思路如下:

  • 默认将页面全部隐藏。
  • 通过导航或链接的方式决定用户能去哪些页面。

如下,例如用bi@excel120.com作为CEO身份:

由于页面都是隐藏状态,他可以通过链接的形式浏览到不同的页面。实际在WEB看到的效果是:

只显示了首页,用户必须通过导航去浏览各个页面。 对于非CEO的楚杰,他可能浏览的权限页面如下:

他并不能浏览PageC页面。

以上这些巧妙的设计,需要两个表来辅助完成:

  • 页面列表,列出了所有的页面以及页面的地址。
  • 权限页面控制,列出了哪些PowerBI账号可以看哪些页面。

我们在报告中用表来显示这个结构的时候,利用了PowerBI的一个技巧,那就是如果值为空(BLANK),会自动隐藏该行,这样我们就巧妙地隐藏了没有权限的页面:

这里又使用了一个技巧,那就是:我们来判断每个页面是否是被当前用户预设的权限表所允许的,如果允许就返回””空白字符,如果不允许就返回空来隐藏。空白字符也起到了一种效果,就是显示页面和链接属性却没有视觉上的值,达到了预期的效果。

这种巧妙的设计灵活地使用了PowerBI各种能力,来弥补它的缺陷。经过测试发现这种方法有两个缺陷,那就是:

  • 发布后要准备好各个页面的实际URL地址备用。
  • 在WEB点击后会打开新浏览器页而不是在当前页跳转。

针对这两个问题可以进一步优化,限于我们已经钻入太深,这里仅给出思路:标签。由于标签也有跳转效果,我们可以针对不同的角色制作不同的标签跳转体系,结合这里的链接权限方法,就可以免除90%记录URL以及新开浏览器页的问题,几乎可以完美解决问题。

总结

我们这里讨论了三种场景下PowerBI灵活动态控制权限的方法,以满足多个角色多个数据权限的自动化控制:

  • 不同用户的指标计算依据他的数据进行,PowerBI内置的行级别安全性(RLS),并借助USERNAME实现动态权限控制。
  • 显示当前用户计算并同时包含某些全局计算,自主全动态安全性控制,关闭RLS并完全借助筛选来实现这一灵活控制,实际中还可以和RLS结合。
  • 向不同的用户显示不同的报告页面(数),借助链接和标签以及安全性实现控制。

另外,值得一提的是,如果将PowerBI与SSAS(内置于SQL Server 2017或Azure Analysis Service中)结合的话,可以控制某张表或某个列对用户的权限,也就是用户可以看不到不希望他看到的表或列,这为自助分析的有效控制又提供了更加细致的方案。

PowerBI 实现不同角色看到内容不同支持动态权限管理的更多相关文章

  1. 基于角色的访问控制 (RBAC)权限管理

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  2. 基于角色访问控制RBAC权限模型的动态资源访问权限管理实现

    RBAC权限模型(Role-Based Access Control) 前面主要介绍了元数据管理和业务数据的处理,通常一个系统都会有多个用户,不同用户具有不同的权限,本文主要介绍基于RBAC动态权限管 ...

  3. 让PHPCms内容页支持JavaScript_

    在PHPCms内容页中,出于完全考虑,默认是禁止JavaScript脚本的,所以我们在添加文章时,虽然加入了js代码,但实际上并没有起作用,而是以文本形式显示.如果要让内容页支持JavaScript, ...

  4. 在Windows Server 2008 R2(x64)上安装.NET Framework 4.5 兼谈.NET Framework 4.0 “在服务器核心角色上不受支持”含义

    完成了一个服务器文件监控系统,该系统的核心是一个Windows服务,需要安装在服务器上.由于是Visual Studio 2012开发,为了保证开发的Windows服务可以运行,必须在Windows服 ...

  5. js读取文本内容,支持csv.txt

    js读取文本内容,支持csv.txt <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  6. Ansible_利用系统角色重用内容

    一.红帽企业Linux系统角色 1.RHEL系统角色 名称 状态 角色描述 rhel-system-roles.kdump 全面支持 配置kdump崩溃恢复服务 rhel-system-roles.n ...

  7. 10月26日 奥威Power-BI基于微软示例库(MSOLAP)快速制作管理驾驶舱 腾讯课堂开课啦

    本次课是基于olap数据源的案例实操课,以微软olap示例库Adventure Works为数据基础.        AdventureWorks示例数据库为一家虚拟公司的数据,公司背景为大型跨国生产 ...

  8. [.Net MVC] 用户角色权限管理_使用CLK.AspNet.Identity

    项目:后台管理平台 意义:一个完整的管理平台需要提供用户注册.登录等功能,以及认证和授权功能. 一.为何使用CLK.AspNet.Identity 首先简要说明所采取的权限控制方式.这里采用了基于角色 ...

  9. mongodb之用户/认证/角色/权限管理

    前言 用户权限管理很重要,只给需要的权限,防止应用系统漏洞导致脱库 认证和授权 Authentication 认证识别,解决我是谁 Authorization 操作授权,我能做什么 认证机制 MONG ...

随机推荐

  1. 递推,求至少连续放置三个U的危险组合

    UVA580-Critical Mass 题意 有两种方块,L和U,有至少三个连续的U称为危险组合,问有多少个危险组合 solution: 至少这个概念比较难求 ,所以转化为(1ll<<n ...

  2. Ajax/Highcharts—动态图表

    前面写过“Highcharts的用法总结”,当然了,在实际应用中,图表数据都是要从后台获取的,根据之前的使用,贴一些例子来分享学习. 首先,如果没有获取后台数据,又希望呈现一个动态图表的话,可以很轻易 ...

  3. OpenWrt下如何配置网络?

    答: 使用uci进行配置,示例如下: uci get network.wan.ifname (笔者得到eth1) uci set network.wan.ifname=ethx (如: uci set ...

  4. jQuery常用AJAX-API

    目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取得服务端当前时间 简单形式:jQuery对象.load(url) 返回结果自动添加到jQuery对象代表的标签中间 如果是Servlet的话,采 ...

  5. MongoDB Input

    Configure Connection Tab Host name(s) or IP address(es):网络名称或者地址.可以输入多个主机名或IP地址,用逗号分隔.还可以通过将主机名和端口号与 ...

  6. COALESCE关键字的使用

    COALESCE是sql标准里面的一个关键字,我们可以和聚合函数sum,count,max等一起使用完成一些特殊的功能. 以下sql语句基于mysql 1.查询某一个列总和,如果没有数据或者NULL返 ...

  7. Redis之快速入门与应用[教程/总结]

    内容概要 因为项目中用户注册发送验证码,需要学习redis内存数据库,故而下午花了些时间进行初步学习.本博文性质属于对今日redis学习内容的小结.在看本博文前或者看完后,可以反问自己三个问题:Red ...

  8. react-native-picke Cannot read property '_init' of undefined

    使用react-native-picker报以下错误: 查看了react-native-picke的issues: https://github.com/beefe/react-native-pick ...

  9. koa2中间件

    在我看来,前端框架的中间件的思想来源于传统后端的切面编程(AOP)思想,比如我们常见的身份校验(JWT). axios的拦截器也是基于这种程序设计模式的. 在koa中,实际上是由一个数组对象来保存所有 ...

  10. Y2K Accounting Bug POJ2586

    Description Accounting for Computer Machinists (ACM) has sufferred from the Y2K bug and lost some vi ...