補充課程 - 動態安全性

適用於: SQL Server 2017 和更新版本的 Analysis Services Azure Analysis Services Fabric/Power BI Premium

在此補充課程中,您會建立實作動態安全性的其他角色。 動態安全性會根據目前登入之使用者的用戶名稱或登入標識碼,提供數據列層級安全性。

若要實作動態安全性,您可以將數據表新增至模型,其中包含可連線至模型並流覽模型對象和數據之使用者的用戶名稱。 您使用本教學課程建立的模型位於 Adventure Works 的內容中;不過,若要完成本課程,您必須新增包含您網域使用者之數據表。 您不需要新增之使用者名稱的密碼。 若要建立 EmployeeSecurity 數據表,其中包含來自您自己網域的小型使用者範例,您可以使用 [貼上] 功能,從 Excel 電子表格貼上員工數據。 在真實案例中,包含使用者名稱的數據表通常是來自實際資料庫做為數據源的數據表;例如,真正的 DimEmployee 數據表。

若要實作動態安全性,您可以使用兩個 DAX 函式:USERNAME 函式 (DAX)LOOKUPVALUE 函式 (DAX)。 這些函式會套用在數據列篩選公式中,以新角色定義。 透過使用 LOOKUPVALUE 函數,公式會指定 EmployeeSecurity 資料表中的值。 然後公式會將該值傳遞至USERNAME函式,此函式會指定登入之使用者的用戶名稱屬於此角色。 然後,使用者只能流覽角色數據列篩選所指定的數據。 在此案例中,您會指定銷售員工只能流覽其所屬銷售領域的因特網銷售數據。

此 Adventure Works 表格式模型案例特有的工作,但不一定適用於真實世界的案例,因此會加以識別。 每個工作都包含描述工作用途的其他資訊。

完成本課程的估計時間:30 分鐘

先決條件

本補充課程文章是表格式模型教學課程的一部分,應該依序完成。 在此補充課程中執行工作之前,您應該已完成所有先前的課程。

將 DimSalesTerritory 數據表新增至 AW 因特網銷售表格式模型專案

若要實作此 Adventure Works 案例的動態安全性,您必須將兩個額外的數據表新增至模型。 您新增的第一個數據表是來自相同 AdventureWorksDW 資料庫的 DimSalesTerritory (如 Sales Territory)。 您稍後會將數據列篩選套用至 SalesTerritory 數據表,以定義登入用戶可流覽的特定數據。

若要新增 DimSalesTerritory 數據表

  1. 在表格式模型總管中,>數據源,以滑鼠右鍵按兩下您的連線,然後按兩下 [匯入新資料表

    如果 [模擬認證] 對話框出現,請輸入您在第 2 課:新增數據中使用的模擬認證。

  2. 在 [導覽器] 中,選取 [DimSalesTerritory 數據表],然後按兩下 [確定]

  3. 在 [查詢編輯器] 中,按兩下查詢 DimSalesTerritory 查詢,然後移除 SalesTerritoryAlternateKey 數據行。

  4. 點選 「匯入」

    新的數據表會新增至模型工作區。 然後,來源 DimSalesTerritory 數據表中的對象和數據會匯入您的 AW 因特網銷售表格式模型。

  5. 成功匯入資料表之後,按兩下 [關閉]

新增具有使用者名稱數據的數據表

AdventureWorksDW 範例資料庫中的 DimEmployee 數據表包含 AdventureWorks 網域中的使用者。 這些使用者名稱不存在於您自己的環境中。 您必須在模型中建立數據表,其中包含來自您組織的實際使用者小型範例(至少三個)。 接著,您會將這些使用者新增為新角色的成員。 您不需要範例使用者名稱的密碼,但您需要來自您自己的網域的實際 Windows 用戶名稱。

若要新增 EmployeeSecurity 數據表

  1. 開啟 Microsoft Excel,建立工作表。

  2. 複製下表,包括標題列,然後將它貼到工作表中。

      |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>|  
    
  3. 將名字、姓氏和 domain\username 取代為您組織中的三位使用者名稱和登入標識符。 針對 EmployeeId 1,將相同的使用者放在前兩個數據列上,顯示此使用者屬於多個銷售領域。 保留 EmployeeId 和 SalesTerritoryId 欄位。

  4. 將工作表儲存為 SampleEmployee

  5. 在工作表中,選取包含員工數據的所有單元格,包括標頭,然後以滑鼠右鍵按下選取的數據,然後按兩下 [複製

  6. 在 SSDT 中,按下 [編輯] 選單的 [],然後按兩下 [貼上]

    如果 [貼上] 呈現灰色,請按兩下模型設計工具視窗中任何數據表中的任何數據行,然後再試一次。

  7. [貼上預覽] 對話方塊的 [數據表名稱]中,輸入 EmployeeSecurity

  8. 在要貼上數據中,確認數據報含 SampleEmployee 工作表中的所有用戶數據和標頭。

  9. 確認已核取 [使用第一個數據列作為數據行標頭],然後按兩下 [確定] [確定]

    系統會建立名為 EmployeeSecurity 的新數據表,其中包含從 SampleEmployee 工作表複製的員工數據。

建立 FactInternetSales、DimGeography 和 DimSalesTerritory 數據表之間的關聯性

FactInternetSales、DimGeography 和 DimSalesTerritory 數據表全都包含通用數據行 SalesTerritoryId。 DimSalesTerritory 數據表中的 SalesTerritoryId 數據行包含每個銷售領域具有不同標識符的值。

若要建立 FactInternetSales、DimGeography 和 DimSalesTerritory 數據表之間的關聯性

  1. 在 [圖表檢視] 的 DimGeography 數據表中,按住 [SalesTerritoryId] 數據行,然後將游標拖曳至 DimSalesTerritory 數據表中的 SalesTerritoryId 數據行,然後放開。

  2. FactInternetSales 數據表中,按住 SalesTerritoryId 數據行,然後將游標拖曳至 DimSalesTerritory 數據表中的 SalesTerritoryId 數據行,然後放開。

    請注意,此關聯性的 Active 屬性為 False,這表示它是非使用中的。 FactInternetSales 數據表已經有另一個作用中的關聯性。

從用戶端應用程式隱藏 EmployeeSecurity 資料表

在這項工作中,您會隱藏 EmployeeSecurity 數據表,使其無法出現在用戶端應用程式的欄位清單中。 請記住,隱藏數據表不會保護它。 如果使用者知道如何,仍然可以查詢 EmployeeSecurity 數據表數據。 若要保護 EmployeeSecurity 數據表數據,防止使用者查詢其任何數據,您可以在稍後的工作中套用篩選。

隱藏客戶端應用程式中的 EmployeeSecurity 資料表

  • 在模型設計師的 [圖表檢視] 中,以滑鼠右鍵按兩下 Employee 資料表標題,然後按兩下 [從用戶端工具隱藏]

建立依地區銷售員工的使用者角色

在這項工作中,您會建立使用者角色。 此角色包含數據列篩選,定義使用者可以看到 DimSalesTerritory 數據表的數據列。 然後,篩選條件會套用在一對多關聯性方向,套用至與 DimSalesTerritory 相關的所有其他數據表。 您也會套用可保護整個 EmployeeSecurity 數據表的篩選,防止任何屬於該角色成員的用戶進行查詢。

注意

您在本課程中建立的「依地區銷售員工」角色會限制成員只流覽其所屬銷售領域的銷售數據(或查詢)。 如果您將使用者新增為「依地區銷售員工」角色的成員,該角色也存在於 第 11 課:建立角色中建立的角色中,您會收到許可權的組合。 當使用者是多個角色的成員時,針對每個角色所定義的許可權和數據列篩選都是累積的。 也就是說,使用者具有由角色組合所決定的更大許可權。

若要依地區建立銷售員工使用者角色

  1. 在 SSDT 中,按兩下 [模型] 選單,然後按兩下 [角色]

  2. 在 [角色管理員]中,按兩下 [[新增]

    具有 None 許可權的新角色會新增至清單。

  3. 點選新角色,然後在 [名稱] 資料行中,將角色重新命名為 [地區銷售員工]

  4. 在 [許可權] 數據行中,按兩下拉式清單,然後選取 [讀取] 許可權

  5. 按兩下 [成員] 索引標籤,然後按兩下 [[新增]。

  6. [選取使用者或群組] 對話框中,在 [輸入名為 的物件以選取,輸入您在建立 EmployeeSecurity 數據表時所使用的第一個範例用戶名稱。 點選 「檢查名稱」 確認使用者名稱是否有效,然後按下 [確定] [確定]

    重複此步驟,新增您在建立 EmployeeSecurity 數據表時所使用的其他範例用戶名稱。

  7. 按兩下 [資料列篩選] 索引標籤。

  8. 針對 EmployeeSecurity 數據表,在 DAX Filter 數據行中,輸入下列公式:

      =FALSE()  
    

    此公式會指定所有數據行解析為 false 布爾值條件。 無法由 Sales Employees by Territory 使用者角色的成員查詢 EmployeeSecurity 數據表的數據行。

  9. 針對 DimSalesTerritory 數據表,輸入下列公式:

    ='DimSalesTerritory'[SalesTerritoryKey]=LOOKUPVALUE('EmployeeSecurity'[SalesTerritoryId], 
      'EmployeeSecurity'[LoginId], USERNAME(), 
      'EmployeeSecurity'[SalesTerritoryId], 'DimSalesTerritory'[SalesTerritoryKey]) 
    

    在此公式中,LOOKUPVALUE 函數會傳回 DimEmployeeSecurity[SalesTerritoryId] 數據行的所有值,其中 EmployeeSecurity[LoginId] 與目前登入的 Windows 用戶名稱相同,而 EmployeeSecurity[SalesTerritoryId] 與 DimSalesTerritory[SalesTerritoryId] 相同。

    LOOKUPVALUE 所傳回的銷售領域標識符集合接著會用來限制 DimSalesTerritory 數據表中顯示的數據列。 只有數據列的 SalesTerritoryID 位於 LOOKUPVALUE 函式所傳回的標識碼集中的數據列。

  10. 在 [角色管理員] 中,按兩下 [確定]

依地區使用者角色測試銷售員工

在這項工作中,您會使用 SSDT 中的 [在 Excel 中進行分析] 功能來測試 Sales Employees by Territory 使用者角色的效力。 您可以指定您在 EmployeeSecurity 資料表中新增的其中一個用戶名稱,並指定為角色的成員。 接著,此使用者名稱會作為 Excel 與模型之間建立之連線的有效用戶名稱。

測試依地區銷售員工的使用者角色

  1. 在 SSDT 中,按兩下 [模型] 選單,然後按兩下 [在 Excel 中分析]

  2. 在 [[在 Excel 中分析] 對話框中,於 [指定用來連線至模型的使用者名稱或角色],選取 [[其他 Windows 使用者],然後按兩下 [瀏覽]。

  3. [選取使用者或群組] 對話框中,在 [輸入物件名稱以選取 []、輸入您在 EmployeeSecurity 數據表中包含的使用者名稱,然後按兩下 [檢查名稱]

  4. 按兩下 [確定] [確定] 關閉 [選取使用者或群組] 對話框 ,然後按兩下 [確定] 關閉 [在 Excel 分析] 對話方塊中的 [分析]。

    Excel 會以新的活頁簿開啟。 會自動建立數據透視表。 數據透視表欄位清單包含新模型中可用的大部分數據欄位。

    請注意,數據透視表 [字段] 清單中看不到 EmployeeSecurity 數據表。 您在上一個工作中從用戶端工具隱藏此資料表。

  5. 在 [字段] 清單中,在 [∑ Internet Sales [量值] 中,選取 [InternetTotalSales 量值]。 量值會輸入 [值] 欄位中。

  6. DimSalesTerritory 數據表中選取 SalesTerritoryId 數據行。 數據列會輸入 數據列標籤 欄位。

    請注意,因特網銷售數位只會針對您使用的有效使用者名稱所屬的一個區域顯示。 如果您從 DimGeography 數據表選取另一個數據行作為 [數據列卷標] 字段,則只會顯示有效使用者所屬銷售領域中的城市。
    此使用者無法瀏覽或查詢其所屬地區以外的任何因特網銷售數據。 這項限制是因為針對 DimSalesTerritory 數據表所定義的數據列篩選,在 Sales Employees by Territory 使用者角色中,會保護與其他銷售領域相關的所有數據的數據。

另請參閱

USERNAME 函式 (DAX)
LOOKUPVALUE 函式 (DAX)
CUSTOMDATA 函式 (DAX)