補足のレッスン-行フィルターを使用した動的なセキュリティの実装
適用対象:
SQL Server 2016 以降 Analysis Services
Azure Analysis Services
Power BI Premium
この補足のレッスンでは、動的なセキュリティを実装する追加のロールを作成します。 動的なセキュリティは、現在ログオンしているユーザーのユーザー名またはログイン ID に基づく行レベルのセキュリティを提供します。 詳細は、ロール を参照してください。
動的なセキュリティを実装するには、データ ソースとしてのモデルへの接続を作成し、モデル オブジェクトとデータを参照できるユーザーの Windows ユーザー名を含むテーブルを、モデルに追加する必要があります。 このチュートリアルで作成するモデルは Adventure Works Corp. のコンテキスト内にありますが、このレッスンを完了するには、自分のドメインのユーザーが含まれているテーブルを追加する必要があります。 追加するユーザー名のパスワードは必要ありません。 EmployeeSecurity テーブルを作成するには、自分のドメインの小さなサンプルユーザーを使用して、貼り付け機能を使用し、Excel スプレッドシートから従業員データを貼り付けます。 実際のシナリオでは、モデルに追加するユーザー名が含まれたテーブルは通常、実際のデータベースのテーブル (たとえば、実際の dimEmployee テーブルなど) をデータ ソースとして使用します。
動的なセキュリティを実装するには、 USERNAME Function (DAX) および LOOKUPVALUE Function (DAX)という 2 つの新しい DAX 関数を使用します。 行フィルター式に適用されるこれらの関数は、新しいロールで定義されています。 数式は LOOKUPVALUE 関数を使用して EmployeeSecurity テーブルの値を指定し、その値を USERNAME 関数に渡します。この関数は、ログオンしているユーザーのユーザー名がこのロールに属することを指定します。 ユーザーは、ロールの行フィルターによって指定されたデータのみを参照できます。 このシナリオでは、販売担当者がインターネット上で自分の販売区域の売上データのみを参照できるように指定します。
この補足のレッスンを完了するには、一連の作業を行います。 この Adventure Works 表形式モデルのシナリオに固有の作業で、実際のシナリオに必ずしも適用されないものは、そのように記載されています。 各作業には、作業の目的を説明する追加情報が含まれています。
このレッスンの推定所要時間: 30 分
前提条件
この補足のレッスンのトピックは表形式モデルのチュートリアルの一部であり、順番に従って実行する必要があります。 この補足のレッスンの作業を実行する前に、前のレッスンをすべて完了している必要があります。
AW Internet Sales Tabular Model プロジェクトへの DimSalesTerritory テーブルの追加
この Adventure Works のシナリオの動的セキュリティを実装するには、2 つの追加テーブルをモデルに追加する必要があります。 最初に追加するテーブルは、同じ AdventureWorksDW データベースの (販売区域としての) dimSalesTerritory です。 後で、ログオンしているユーザーが参照できる特定のデータを定義する行フィルターを SalesTerritory テーブルに適用します。
DimSalesTerritory テーブルを追加するには
SSDT で、[ モデル ] メニューをクリックし、[ 既存の接続] をクリックします。
[既存の接続] ダイアログ ボックスで [Adventure Works DB from SQL] データ ソース接続が選択されていることを確認し、 [開く]をクリックします。
[権限借用の資格情報] ダイアログ ボックスが表示された場合は、「レッスン 2: データの追加」で使用した権限借用の資格情報を入力します。
[データのインポート方法の選択] ページで、 [インポートするデータをテーブルとビューの一覧から選択する] が選択されていることを確認し、 [次へ]をクリックします。
[テーブルとビューの選択] ページで、 DimSalesTerritory テーブルをクリックします。
[プレビューとフィルター]をクリックします。
SalesTerritoryAlternateKey 列を選択解除して、 [OK]をクリックします。
[テーブルとビューの選択] ページで、 [完了]をクリックします。
新しいテーブルがモデル ワークスペースに追加されます。 ソースの DimSalesTerritory テーブルのオブジェクトおよびデータが AW Internet Sales Tabular Model にインポートされます。
テーブルのインポートが完了したら、 [閉じる]をクリックします。
ユーザー名データを含むテーブルの追加
AdventureWorksDW サンプル データベース内の DimEmployee テーブルには AdventureWorks ドメインのユーザーが含まれており、それらのユーザー名はご使用の環境に存在しないため、組織の実在ユーザーから小人数 (3 人) のサンプルを含むテーブルをモデルに作成する必要があります。 その後、これらのユーザーを新しいロールにメンバーとして追加します。 サンプルのユーザー名のパスワードは不要ですが、自分のドメインの実際の 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>|名、姓、および domain\username を組織の 3 人のユーザーの名前とログイン ID に置き換えます。 先頭の 2 つの行に、EmployeeId 1 の同じユーザーを配置します。 これは、このユーザーが 1 つ以上の販売区域に属していることを示します。 EmployeeId フィールドと SalesTerritoryId フィールドはそのままにします。
ワークシートを SampleEmployee として保存します。
ワークシートで、従業員データを含むすべてのセル (ヘッダーを含む) を選択し、選択したデータを右クリックして、[ コピー] をクリックします。
SSDT で、[編集] メニューをクリックし、[貼り付け] をクリックします。
[貼り付け] がグレー表示されている場合は、モデル デザイナー ウィンドウの任意のテーブルの任意の列をクリックし、もう一度操作を行います。
[貼り付けプレビュー] ダイアログ ボックスの [テーブル名] に、「EmployeeSecurity」と入力します。
[ 貼り付けるデータ] で、sampleemployee ワークシートのすべてのユーザーデータとヘッダーがデータに含まれていることを確認します。
[先頭の行を列見出しとして使用する] がオンであることを確認し、[OK] をクリックします。
SampleEmployee ワークシートからコピーした従業員データを含む、EmployeeSecurity という名前の新しいテーブルが作成されます。
FactInternetSales、DimGeography、および DimSalesTerritory テーブル間のリレーションシップの作成
FactInternetSales、DimGeography、および DimSalesTerritory テーブルはすべて、共通の列である SalesTerritoryId を含みます。 DimSalesTerritory テーブルの SalesTerritoryId 列には、販売区域ごとに異なる ID の値が含まれています。
FactInternetSales、DimGeography、および DimSalesTerritory テーブル間のリレーションシップを作成するには
モデルデザイナーのダイアグラムビューのDimGeographyテーブルで、 SalesTerritoryId列をクリックしたまま、カーソルをDimSalesTerritoryテーブル内のSalesTerritoryId列にドラッグして離します ()。
FactInternetSalesテーブルで、 SalesTerritoryId列をクリックしたまま、カーソルをDimSalesTerritoryテーブルのSalesTerritoryId列にドラッグして離します。
このリレーションシップの Active プロパティが False (つまり非アクティブ) になっていることを確認します。 これは、FactInternetSales テーブルには、メジャーで使用されている別のアクティブなリレーションシップが既に存在するためです。
クライアント アプリケーションで EmployeeSecurity テーブルを非表示にする
このタスクでは、クライアントアプリケーションのフィールドリストに表示されないように、EmployeeSecurity テーブルを非表示にします。 テーブルを非表示にしても、セキュリティで保護されるわけではないことに注意してください。 方法を知っている場合、ユーザーは引き続き EmployeeSecurity テーブル データのクエリを実行できます。 EmployeeSecurity テーブルのデータをセキュリティで保護するために、ユーザーがそのデータを照会できないようにするには、後の作業でフィルターを適用します。
クライアント アプリケーションで EmployeeSecurity テーブルを非表示にするには
- モデル デザイナーのダイアグラム ビューで、Employee テーブルの見出しを右クリックし、[クライアント ツールに非表示] をクリックします。
Sales Employees by Territory ユーザー ロールの作成
この作業では、新しいユーザー ロールを作成します。 このロールには、DimSalesTerritory テーブルのどの行がユーザーに表示されるかを定義する行フィルターが含まれます。 このフィルターは、一対多のリレーションシップの方向で、DimSalesTerritory に関連する他のすべてのテーブルに適用されます。 また、ロールのメンバーであるユーザーがクエリを実行できないように、EmployeeSecurity テーブル全体を保護する単純なフィルターも適用します。
注意
このレッスンで作成する Sales Employees by Territory ロールによって、メンバーが参照 (またはクエリを実行) できるデータは、自分が属する販売区域の売上データのみに制限されます。 「レッスン 11: ロールの作成」で作成したロールのメンバーとしても存在する Sales Employees by 区域ロールのメンバーとしてユーザーを追加すると、アクセス許可の組み合わせが得られます。 あるユーザーが複数のロールのメンバーである場合、各ロールに対して定義された権限と行フィルターは累積されます。 つまり、ロールを組み合わせることでユーザーの権限は引き上げられます。
Sales Employees by Territory ユーザー ロールを作成するには
SSDT で、[モデル] メニューをクリックし、[ロール] をクリックします。
[ロール マネージャー] で、 [新規] をクリックします。
"なし" 権限を設定された新しいロールがリストに追加されます。
新しいロールをクリックし、 [名前] 列で、ロールの名前を「 Sales Employees by Territory」に変更します。
[権限] 列で、ドロップダウン リストをクリックし、[読み取り] 権限を選択します。
[メンバー] タブをクリックし、 [追加]をクリックします。
[ユーザーまたはグループの選択] ダイアログ ボックスの [選択するオブジェクト名を入力してください] に、EmployeeSecurity テーブルの作成で使用した最初のサンプル ユーザー名を入力します。 [名前の確認] をクリックしてユーザー名が有効であることを確認し、[OK] をクリックします。
この手順を繰り返して、EmployeeSecurity テーブルの作成で使用した他のサンプル ユーザー名を追加します。
[行フィルター] タブをクリックします。
EmployeeSecurityテーブルの [ DAX フィルター ] 列に、次の式を入力します。
=FALSE()この数式は、すべての列がブール値条件 false に解決されることを指定します。このため、EmployeeSecurity テーブルで Sales Employees by Territory ユーザー ロールのメンバーがクエリを実行できる列はありません。
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 関数によって、EmployeeSecurity[LoginId] と現在ログオンしている Windows ユーザー名が同じで、EmployeeSecurity[SalesTerritoryId] と DimSalesTerritory[SalesTerritoryId] が同じであるすべての列の DimEmployeeSecurity[SalesTerritoryId] の値が返されます。
LOOKUPVALUE によって返された一連の 販売区域の ID を使用して、DimSalesTerritory テーブルに表示される行が制限されます。 行の SalesTerritoryID が LOOKUPVALUE 関数で返された一連の ID の中にある行のみが表示されます。
[ロール マネージャー] で、[OK] をクリックします。
Sales Employees by Territory ユーザー ロールのテスト
このタスクでは、SSDT の [分析に含まれる Excel] 機能を使用して、販売員別の営業担当者のユーザーロールの有効性をテストします。 EmployeeSecurity テーブルに追加したユーザー名のいずれかを指定し、ロールのメンバーとして指定します。 このユーザー名は、Excel とモデルの間に作成された接続で有効なユーザー名として使用されます。
Sales Employees by Territory ユーザー ロールをテストするには
SSDT で、[モデル] メニューをクリックし、[Excel で分析] をクリックします。
[Excel で分析] ダイアログ ボックスの [モデルへの接続に使用するユーザー名またはロールを指定します] で、[その他の Windows ユーザー] をクリックし、[参照] をクリックします。
[ユーザーまたはグループの選択] ダイアログ ボックスの [選択するオブジェクト名を入力します] に、EmployeeSecurity テーブルに追加したいずれかのユーザー名を入力し、[名前の確認] をクリックします。
[OK] をクリックして [ユーザーまたはグループの選択] ダイアログ ボックスを閉じ、[OK] をクリックして [Excel で分析] ダイアログ ボックスを閉じます。
新しいノートブックで Excel が開きます。 ピボットテーブルが自動的に作成されます。 [ピボットテーブルのフィールド] リストには、新しいモデルで使用できるほとんどのデータ フィールドが表示されます。
EmployeeSecurity テーブルが [ピボットテーブルのフィールド] リストに表示されていないことを確認します。 これは、前の作業でクライアント ツールからこのテーブルを非表示にすることを選択したためです。
[フィールド] リストの ∑ Internet Sales (メジャー) で、InternetTotalSales メジャーを選択します。 メジャーは 値 フィールドに入力されます。
DimSalesTerritory テーブルの SalesTerritoryId 列を選択します。 列は 行ラベル フィールドに入力されます。
使用した有効なユーザー名が属している 1 つのリージョンのインターネット販売成績のみが表示されていることに注意してください。 たとえば DimGeography テーブルの City など、別の列を "行ラベル" フィールドとして選択すると、有効なユーザーが属する販売区域の都市のみが表示されます。
このユーザーは、自分が属する区域以外の区域のインターネット販売データを参照したり、クエリを実行することはできません。これは、Sales Employees by Territory ユーザー ロールで Sales Territory テーブルに定義された行フィルターによって、他の販売区域に関連するすべてのデータが効果的に保護されているためです。