Power Apps Portals で階層型セキュリティーを実現する

こんにちは。日本マイクロソフトの向井です。
今回はPower Apps Portals で階層型のセキュリティーを実現する方法をご紹介します。

# 0. 実現したい階層型セキュリティー
今回実現したいのは以下のような階層型セキュリティーです。
コントソ庁に所属する人はすべてのレコードを参照できる。
宮城県に所属する人は宮城県、仙台市、名取市、事業者A、事業者B、事業者Cのレコードを参照できる。
・・・　
といった感じです。

![階層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/0f17c74e-7aec-13b8-7b1f-f2ea894dde2f.png)

このように所属によってアクセスできるレコード（データ）を変えるには以下の作成、設定が必要です。
①親子関係をもつ取引先企業を作成する
②取引先担当者を作成し取引先企業に紐づける
③取引先担当者にWebロールを付与する
④階層構造をもったテーブルのアクセス許可を作成し、テーブルのアクセス許可をWebロールに紐づける


今回使用する各テーブルの関係は以下のようになっています。
![データ構造.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/86127101-d89c-b75b-6d97-4cf3d5cebbf2.png)


これらについて、１つずつ詳しく解説していきます。

# 1. 親子関係をもつ取引先企業の作成
Power Apps では所属先の企業、組織などは取引先企業というあらかじめ用意されたテーブルで管理します。
取引先企業には親子関係を持たせることができます。（この機能は通常、親会社、子会社のような関係を表すのに使用します。）

今回の場合ですと、
宮城県、埼玉県の親はコントソ市
仙台市、名取市の親は宮城県・・・
というようになります。

まず、Power Apps の画面からデータ＞テーブル＞取引先企業(英語名はAccount)を開き、データタブからレコードの追加をクリックして取引先企業レコードを作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/034d5a07-7347-b7a3-51e2-671ec110c4c1.png)
※画像では既にデータが登録されています。

上の階層のレコードから作成していきます。
今回は「コントソ庁」という名前の取引先企業を作成します。
入力後、保存して閉じるをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/2e362894-0120-e28f-c249-78938b415f76.png)

同様にして、1つ下の階層のレコードを作っていきます。
今回は「宮城県」というデータを作成します。
宮城県の親はコントソ庁となるので、Parent Account(英語な場合)にで先ほど作成したコントソ庁を選択します。
入力後、保存して閉じるをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/ae2f1c73-e549-cbd2-c889-edbd36e77ee8.png)

この手順で、他のレコードも作成し、親子関係を作っていきます。

# 2. 取引先担当者の作成
Power Apps Portals で作成したポータルにサインインするユーザーの情報は取引先担当者というテーブルで管理します。

取引先担当者には所属する取引先企業の情報を紐づけることができます。

ポータル管理アプリ（モデル駆動型アプリ）を開き、左のメニューから取引先担当者(=Contacts)を選択し、新しいレコードを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/8862fb21-acd0-c626-8bb2-3ac2958f63ac.png)

ハイライトしたように所属する組織の情報を紐づけ、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/a72c60bc-7128-f50e-9b43-e6dae15c440f.png)


各ユーザーをこのようにして取引先企業に紐づけます。

# 3. 取引先担当者にWebロールを付与する
前項で作成した取引先担当者にWebロールを紐づけていきます。
関連(Related)をクリックして、Webロールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/a95e79e5-f013-a730-8371-219a09da45d9.png)

既存のWebロールを追加する(Add Existing Web Role)をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/f02709d6-f023-2e2c-9bcb-995a4ccd4927.png)

今回はPartner Sellerを追加しました。
（もちろん新しいWebロールを作成して使用することもできますが、今回は簡単のため、既存のWebロールを使用しました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/63ca92f5-0c7a-9a4a-fff4-3756d0c9e857.png)
※画像では既に追加されています。


ここでもう一度今回実現したい階層セキュリティーを確認します。

コントソ庁に所属するユーザーはすべてのレコードにアクセスできるようにしたいので、特別なWebロールを付与します。（今回はAdministratorを付与しました。）

それ以外の組織に所属するユーザーは、自分の組織配下のレコードにアクセスできるようにします。
これらには同一のWebロール（今回はPatener Seller）を付与し、そのWebロールに紐づけるテーブルのアクセス許可に階層を持たせることで、これを実現します。

![webロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/cbd9c799-5ab5-dbcb-5de1-f117084f37aa.png)

これで取引先担当者にWebロールを紐づけることができました。


# 4. テーブルのアクセス許可をWebロールに追加する
# 4.1 テーブルアクセス許可の作成
Power Apps Portals では各テーブルごとにテーブルのアクセス許可を作成する必要があります。
たとえば、「取引先企業」テーブルと「サポート案件」テーブルをポータル上で参照させたい場合は、「取引先企業」用のテーブルのアクセス許可と「サポート案件」用のテーブルのアクセス許可が必要です。

また、テーブルのアクセス許可にも親子関係を作成することができます。
この親子関係の使用場面は
①今回のように所属組織によってアクセスできるレコードを変えたい場合
②「取引先企業」と「サポート案件」のような関係のテーブルへのアクセス許可を作成したい場合
になります。（今回は話がややこしくなるため割愛します）
です。

今回は「取引先企業」テーブルのテーブルアクセス許可を作成していきます。

宮城県に所属するユーザーhに注目すると、
宮城県に紐づく取引先企業レコードは①のテーブルのアクセス許可で、
仙台市に紐づく取引先企業レコードは②のテーブルのアクセス許可で、
事業者Aに紐づく取引先企業レコードは③のテーブルのアクセス許可で、アクセスすることができます。

![テーブルのアクセス許可.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/6e3ce153-6f08-e025-bc5d-36e32d284ac8.png)


①のテーブルのアクセス許可は、元から用意されているAccess to Parent Partner Accountを使用しました。
②③のテーブルのアクセス許可を作成していきます。

左のメニューからテーブルのアクセス許可（Table Permissions）を選択し、新しくレコードを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/9094cfe5-e506-c0a2-bbf5-f69e019d34e3.png)

Table Nameはaccount(=取引先企業)
Access TypeはParent
を選択します。

Parent Table Permissionは、親となるテーブルのアクセス許可（今回はAccess to Parent Partner Account）を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/1e3b9cab-3275-0bc8-630b-aeb731207d88.png)
その他必要項目を入力後、保存します。

同様に、2階層目のテーブルのアクセス許可も作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/2ed6509e-fe41-f305-ccee-9d0955c4cabf.png)

これでテーブルのアクセス許可を作成することができました。

# 4.2 テーブルのアクセス許可にWebロールを追加する
3 でユーザーに付与したWebロールをテーブルのアクセス許可に追加します。

階層の一番上のテーブルのアクセス許可であるAccess to Parent Partner Accountを開き、関連からWebロールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/eeface10-c470-1853-2739-d54148567bc3.png)

Add Existing Web Roleから3 でユーザーに付与したWebロールであるPartner Sellerを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/d17f97b2-c7e6-b8ac-9bad-950e0cfdce33.png)
※画像では既に追加されています。


以上の設定により階層を持たせたアクセス制御を行うことができます。