返回列表 发帖

使用行筛选器实现动态安全性

适用于:SQL Server 2016 及更高版本Analysis Services Azure Analysis Services  Power BI Premium

在本补充课程中,您将另外创建一个实现动态安全性的角色。 动态安全性基于当前已登录用户的用户名或登录 ID 提供行级别安全性。 若要了解详细信息,请参阅角色。

若要实现动态安全性,您必须向模型中添加一个表,该表中包含那些可以创建与模型的连接作为数据源并可浏览模型对象和数据的用户的 Windows 用户名。 您使用本教程创建的模型位于 Adventure Works Corp. 上下文中;但是,若要完成本课程,您必须添加一个表,其中包含来自您自己域的用户。 您不需要将添加的用户名的密码。 若要创建 EmployeeSecurity 表,以及来自你自己的域的少量用户示例,你将使用"粘贴"功能,从一个电子表格粘贴Excel数据。 在实际应用场景中,包含添加到模型中的用户名的表通常将使用实际数据库中的表作为数据源;例如,实际的 dimEmployee 表。

为了实现动态安全性,将使用两个新的 DAX 函数: USERNAME 函数 (DAX) 和 LOOKUPVALUE 函数 (DAX)。 在行筛选器公式中应用的这些函数在新角色中定义。 该公式使用 LOOKUPVALUE 函数指定 EmployeeSecurity 表中的值,然后将该值传递给 USERNAME 函数,后者指定已登录用户的用户名属于此角色。 然后,用户可以只浏览角色的行筛选器指定的数据。 在这种情况下,您将指定销售员工只能浏览自己为其中成员的销售区域的 Internet 销售数据。

若要完成本补充课程,您将需要完成一系列任务。 本 Adventure Works 表格模型方案特有的、但不一定适用于真实方案的任务就是以这种形式确定的。 每个任务包括附加的信息用于描述任务的目的。

完成本课程的估计时间: 30 分钟

先决条件
本补充课程主题是表格建模教程的一部分,应当按顺序完成。 在执行本补充课程中的任务之前,应已完成前面的课程。

将 DimSalesTerritory 表添加到 AW Internet 销售表格模型项目
若要为此 Adventure Works 方案实现动态安全性,您必须向模型中另外添加两个表。 第一个要添加的表是来自同一 AdventureWorksDW 数据库的 dimSalesTerritory(作为 Sales Territory)。 稍后,你将向 SalesTerritory 表应用行筛选器,该表定义登录用户可以浏览的特定数据。

添加 DimSalesTerritory 表
在 SSDT 中,单击" 模型" 菜单,然后单击"现有 连接"。

在“现有连接”对话框中,确认已选中“Adventure Works DB from SQL”数据源连接,然后单击“打开”。

如果出现“模拟凭据”对话框,请键入在“第 2 课:添加数据”中使用的模拟凭据。

在“选择如何导入数据”页上,保持选中“从表和视图的列表中进行选择,以便选择要导入的数据”,然后单击“下一步”。

在“选择表和视图”页上,选择“DimSalesTerritory”表。

单击“预览并筛选”。

取消选择“SalesTerritoryAlternateKey”列,然后单击“确定”。

在“选择表和视图”页上,单击“完成”。

新表将添加到模型工作区中。 然后,DimSalesTerritory 源表中的对象和数据将导入 AW Internet 销售表格模型。

导入该表后,单击“关闭”。

添加包含用户名数据的表
由于 AdventureWorksDW 示例数据库中的 DimEmployee 表包含来自 AdventureWorks 域的用户,而这些用户名在自己的环境中并不存在,因此,必须在模型中创建一个表,其中包含组织中的少量(三个)实际用户示例。 然后,将这些用户作为成员添加到新角色中。 您不需要示例用户名的密码,但需要来自您自己域的实际 Windows 用户名。

添加 EmployeeSecurity 表
打开 Microsoft Excel 并创建新的工作表。

复制以下表(包括标题行),然后将其粘贴到该工作表。


复制
  |EmployeeId|SalesTerritoryId|FirstName|LastName|LoginId|  
  |---------------|----------------------|--------------|-------------|------------|  
  |1|2|<user first name>|<user last name>|\<domain\username>|  
  |1|3|<user first name>|<user last name>|\<domain\username>|  
  |2|4|<user first name>|<user last name>|\<domain\username>|  
  |3|5|<user first name>|<user last name>|\<domain\username>|  
将名字、姓氏和域\用户名替换为组织中三个用户的姓名和登录 ID。 在 EmployeeId 1 的前两行中添加相同的用户。 这表示此用户属于多个销售区域。 将 EmployeeId 和 SalesTerritoryId 字段保留原样。

将该工作表保存为 SampleEmployee。

在工作表中,选择包含员工数据(包括标头)的所有单元格,然后右键单击所选数据,然后单击"复制 "。

在 SSDT 中单击“编辑”菜单,并单击“粘贴”。

如果“粘贴”灰显,请在模型设计器窗口中单击任一表中的任一列,并重试。

在“粘贴预览”对话框中的“表名”内,键入 EmployeeSecurity。

在 "要粘贴的数据"中,验证数据是否包括 SampleEmployee 工作表中所有的用户数据和标头。

检查是否已选中“使用第一行作为列标题”,并单击“确定”。

现已创建名为 EmployeeSecurity 的新表,其中包含从 SampleEmployee 工作表复制的员工数据。

在 FactInternetSales、DimGeography 和 DimSalesTerritory 表之间创建关系
所有 FactInternetSales、DimGeography 和 DimSalesTerritory 表包含通用列 SalesTerritoryId。 DimSalesTerritory 表中的 SalesTerritoryId 列包含对应于每个销售区域的不同 ID 值。

在 FactInternetSales、DimGeography 与 DimSalesTerritory 表之间创建关系
在模型设计器的"关系图视图"的"DimGeography"表中,单击并按住"SalesTerritoryId"列,然后将光标拖到 DimSalesTerritory 表中的 SalesTerritoryId 列,然后释放。

在 FactInternetSales 表中,单击并按住 SalesTerritoryId 列,然后将光标拖到 DimSalesTerritory 表中的 SalesTerritoryId 列,然后释放。

请注意,此关系的“活动”属性为 False,表示它处于非活动状态。 这是因为 FactInternetSales 表已有另一个在度量值中使用的活动关系。

在客户端应用程序中隐藏 EmployeeSecurity 表
在此任务中,将隐藏 EmployeeSecurity 表,使该表不会显示在客户端应用程序的字段列表中。 请注意,隐藏某个表并不会对它提供保护。 用户仍可以查询 EmployeeSecurity 表数据,(如果知道怎样查询)。 为了保护 EmployeeSecurity 表数据,防止用户查询其任何数据,你将在稍后的任务中应用筛选器。

在客户端应用程序中隐藏 EmployeeSecurity 表
在模型设计器的“关系图视图”中,右键单击“员工”表标题,并单击“从客户端工具中隐藏”。
创建“区域销售员工”用户角色
在此任务中,您将创建一个新的用户角色。 此角色将包括一个行筛选器,用于定义 DimSalesTerritory 表的哪些行对用户可见。 然后,该筛选器将以一个对多的关系方向应用到与 DimSalesTerritory 相关的其他所有表。 还将应用一个简单的筛选器,用于保护整个 EmployeeSecurity 表,使角色成员的任何用户都能够查询该表。

备注

在本课程中创建的“区域销售员工”角色将成员限制为只能浏览(或查询)他们所属销售区域的销售数据。 如果将用户作为成员添加到"Sales Employees by Territory"角色,该角色也作为第 11 课:创建角色中创建的角色中的成员存在,你将获得权限的组合。 如果用户是多个角色的成员,则针对每个角色定义的权限和行筛选器可以累计。 也就是说,该用户将具有角色组合所确定的更大权限。

创建“区域销售员工”用户角色
在 SSDT 中单击“模型”菜单,并单击“角色”。

在“角色管理器”中单击“新建”。

随后会将一个“无”权限的新角色添加到列表中。

单击新角色,然后在“名称”列中,将角色重命名为 Sales Employees by Territory。

在“权限”列中,单击下拉列表,并选择“读取”权限。

单击“成员”选项卡,然后单击“添加”。

在“选择用户或组”对话框中的“输入要选择的对象名称”内,键入创建 EmployeeSecurity 表时使用的第一个示例用户名。 单击“检查名称”验证该用户名是否有效,并单击“确定”。

重复此步骤添加创建 EmployeeSecurity 表时使用的其他示例用户名称。

单击“行筛选器”选项卡。

对于 EmployeeSecurity 表,在 "DAX 筛选器" 列中,键入以下公式。


复制
  =FALSE()  
此公式指定所有列将解析为 false 布尔条件;因此,“区域销售员工”用户角色的成员无法查询 EmployeeSecurity 表的任何列。

对于 DimSalesTerritory 表,键入以下公式。


复制
='Sales Territory'[Sales Territory Id]=LOOKUPVALUE('Employee Security'[Sales Territory Id],
  'Employee Security'[Login Id], USERNAME(),
  'Employee Security'[Sales Territory Id],
  'Sales Territory'[Sales Territory Id])
此公式中,LOOKUPVALUE 函数返回 DimEmployeeSecurity[SalesTerritoryId] 列的所有值,其中,EmployeeSecurity[LoginId] 是与当前的 Windows 登录用户名相同,EmployeeSecurity[SalesTerritoryId] 与 DimSalesTerritory[SalesTerritoryId] 相同。

然后,使用 LOOKUPVALUE 返回的销售区域 ID 集限制 DimSalesTerritory 表中显示的行。 只会显示其行 SalesTerritoryID 在 LOOKUPVALUE 函数返回的 ID 集内的行。

在角色管理器中单击“确定”。

测试“区域销售员工”用户角色
在此任务中,将使用 SSDT 中的 "在 Excel 中分析" 功能来测试 "区域销售员工" 用户角色的效力。 你将指定添加到 EmployeeSecurity 表中的用户名之一,并将其作为角色的成员。 然后,此用户名将用作在 Excel 和模型之间创建的连接中的有效用户名。

测试“区域销售员工”用户角色
在 SSDT 中单击“模型”菜单,并单击“在 Excel 中分析”。

在“在 Excel 中分析”对话框中的“指定用于连接到模型的用户名或角色”内,选择“其他 Windows 用户”,然后单击“浏览”。

在“选择用户或组”对话框中的“输入要选择的对象名称”内,键入已包含在 EmployeeSecurity 表中的用户名之一,并单击“检查名称”。

单击“确定”关闭“选择用户或组”对话框,并单击“确定”关闭“在 Excel 中分析”对话框。

Excel 将打开一个新的工作簿。 将自动创建一个数据透视表。 “数据透视表字段”列表包含新模型中可用的大多数数据字段。

请注意,EmployeeSecurity 表在数据透视表字段列表中不可见。 这是因为您在前一任务中选择了从客户端工具隐藏此表。

在“字段”列表中的“∑ Internet 销售”(度量值)内,选择“InternetTotalSales”度量值。 该度量值将会输入到“值”字段中。

从“DimSalesTerritory”表中选择“SalesTerritoryId”列。 该列将会输入到“行标签”字段中。

请注意,只显示所用有效用户名所属的一个区域的 Internet 销售数字。 如果从 DimGeography 表中选择另一列(例如“城市”)作为“行标签”字段,则只会显示有效用户所属销售区域中的城市。

此用户不能浏览或查询其所属的区域之外的区域的任何 Internet 销售数据,因为在 Sales Employees by Territory 用户角色中为 Sales Territory 表定义的行筛选器有效地保护了与其他销售区域相关的所有数据。

另请参阅
USERNAME 函数 (DAX)
LOOKUPVALUE 函数 (DAX)
CUSTOMDATA 函数 (DAX)

建议的内容
表格模型中Analysis Services透视
了解表格模型中的透视如何定义模型的可查看子集,这些子集提供模型的有重点、特定于业务或特定于应用程序的视点。
Analysis Services
介绍表格模型的 DirectQuery 模式。
Analysis Services 表格模型中的 DAX
了解对于表格模型,DAX 公式用在计算列、度量值和行筛选器中。
表格建模概述-Analysis Services
了解 Analysis Services 中的表格模型是在内存中或在 DirectQuery 模式下运行的数据库,它连接到后端关系数据源中的数据。
本文内容

先决条件
将 DimSalesTerritory 表添加到 AW Internet 销售表格模型项目
添加包含用户名数据的表
在 FactInternetSales、DimGeography 和 DimSalesTerritory 表之间创建关系
管理 Cookie
早期版本
博客

返回列表