将行级别安全性用于 Power BI 工作区集合
行级别安全性 (RLS) 可用于限制用户对报表或数据集内特定数据的访问,使多个不同的用户在查看不同数据的同时,能够使用相同的报表。 Power BI 工作区集合支持使用 RLS 配置的数据集。
重要
Power BI 工作区集合已弃用,到 2018 年 6 月 或合同指示时可用。 建议你规划到 Power BI Embedded 的迁移以避免应用程序中断。 有关如何将数据迁移到 Power BI Embedded 的信息,请参阅如何将 Power BI 工作区集合内容迁移到 Power BI Embedded。
若要利用 RLS,必须了解三个重要概念:用户、角色和规则。 下面更详细地讲解每个概念:
用户 – 查看报表的实际最终用户。 在 Power BI 工作区集合中,用户按应用令牌中的用户名属性标识。
角色 – 用户属于角色。 角色是规则的容器,可命名为类似于“销售经理”或“销售代表”的名称。 在 Power BI 工作区集合中,用户按应用令牌中的角色属性标识。
规则 – 角色具有规则,这些规则是要应用到数据的实际筛选器。 规则可以像“Country = USA”一样简单,也可以是更动态的对象。
示例
本文的余下部分将提供编写 RLS,然后在嵌入式应用程序中使用 RLS 的示例。 我们的示例使用零售分析示例 PBIX 文件。
零售分析示例显示特定零售链中所有商店的销售额。 如果不使用 RLS,无论哪个区域的经理在登录后查看报表时,都会看到相同的数据。 高级管理层决定只允许每个区域经理查看他们所管理的商店的销售额。为实现此目的,可以使用 RLS。
RLS 在 Power BI Desktop 中进行编写。 当打开数据集和报表时,我们可以切换到关系图视图来查看架构:
下面介绍了此架构的几个注意事项:
所有度量值(例如,总销售额)均存储在“销售”事实数据表中。
另外还有四个相关维度表:“项目”、“时间”、“商店”和“地区”。
关系行上的箭头指示筛选器从一个表流向另一个表的方式。 例如,如果筛选器位于“时间[日期]”上,在当前架构中,它将仅筛选出“销售”表中的值。 其他表不受此筛选器的影响,因为关系线的所有箭头都指向销售表,未指向其他方向。
“地区”表指示每个区的经理:
根据此架构,如果将筛选器应用到“区域”表中的“区域经理”列,并且该筛选器与查看报表的用户匹配,则该筛选器也向下筛选“商店”和“销售”表,只显示该特定区域经理的数据。
方法如下:
在“建模”选项卡中,单击“管理角色”。
创建名为“经理”的新角色。
在“区域”表中输入以下 DAX 表达式:[District Manager] = USERNAME()
为确保规则正常运行,请在“建模”选项卡中单击“以角色身份查看”,并输入以下内容:
报表随即会显示数据,与使用 Andrew Ma 登录时的情况一样。
应用该筛选器(我们此处进行的操作)筛选出“地区”、“商店”和“销售”表中的所有记录。 但是,由于对“销售”与“时间”之间的关系应用了筛选方向,因此,“销售”和“项”,以及“项”和“时间”表不会向下筛选。
这种模式也许能够满足某种要求,但如果不希望经理查看他们没有任何销售的项,则可以针对关系启用双向交叉筛选,使安全筛选器同时流向两个方向。 为此,可以编辑“销售”与“项”之间的关系,如下所示:
现在,筛选器可以从“销售”表流向“项”表:
注意
如果针对数据使用 DirectQuery 模式,必须选择以下两个选项来启用双向交叉筛选:
- “文件”->“选项和设置”->“预览功能”-> “为 DirectQuery 启用两个方向的交叉筛选”。
- “文件”->“选项和设置”->“DirectQuery”-> “允许 DirectQuery 模式下不受限制的度量”。
要了解有关双向交叉筛选的详细信息,请下载 SQL Server Analysis Services 2016 和 Power BI Desktop 中的双向交叉筛选白皮书。
这就是需要在 Power BI Desktop 中完成的所有工作,但要使定义的 RLS 规则能够在 Power BI Embedded 中正常运行,还有一个小问题需要解决。 用户由应用程序进行身份验证和授权,应用令牌用于授予用户对特定 Power BI Embedded 报表的访问权限。 Power BI Embedded 并不具体地知道谁是用户。 要使 RLS 正常运行,需要将一些附加上下文作为应用令牌的一部分传递:
- username(可选)- 与 RLS 一起使用,这是一个字符串,可以在应用 RLS 规则时帮助标识用户。 请参阅“Using Row Level Security with Power BI Embedded”(在 Power BI Embedded 中使用行级别安全性)
- roles - 一个字符串,包含应用行级别安全性规则时可选择的角色。 如果传递多个角色,则这些角色应该作为字符串数组传递。
使用 CreateReportEmbedToken 方法创建令牌。 如果提供 username 属性,则也必须在角色中至少传递一个值。
例如,可以更改 EmbedSample。 可以将 DashboardController 第 55 行内容从
var embedToken = PowerBIToken.CreateReportEmbedToken(this.workspaceCollection, this.workspaceId, report.Id);
to
var embedToken = PowerBIToken.CreateReportEmbedToken(this.workspaceCollection, this.workspaceId, report.Id, "Andrew Ma", ["Manager"]);'
完整的应用令牌如下所示:
现已组合所有信息片段,当某人登录应用程序查看此报表时,会根据行级别安全性的定义,看到其有权查看的数据。
另请参阅
Power BI 行级别安全性 (RLS)
在 Power BI 工作区集合中进行身份验证和授权
Power BI Desktop
JavaScript 嵌入示例
更多问题? 尝试参与 Power BI 社区