Common Data Service セキュリティモデル : フィールドレベルセキュリティ

[前回](https://qiita.com/kenakamu/items/eed3b6ae561c4e9ca148)は階層セキュリティを見ていきました。今回はフィールドレベルセキュリティを説明します。

[参照:アクセスを制御するフィールド レベルのセキュリティ](https://docs.microsoft.com/ja-jp/power-platform/admin/field-level-security)

#　フィールドレベルセキュリティ

これまで見てきた Common Data Service (CDS) のセキュリティは、対象がレコード単位でした。しかしクレジットカード番号や電話番号などを保護したい場合、レコードレベルではなくフィールドレベルでセキュリティを担保する必要があります。

フィールドレベルセキュリティは以下の要素で構成されます。

- フィールド単位での機能有効化
- セキュリティプロファイル

# フィールド単位での機能有効化

フィールドレベルセキュリティを有効にしたい列で設定を有効にします。ここでは取引先担当者の携帯番号に対してセキュリティを設定します。尚、フィールドレベルセキュリティの設定は、詳細設定から行います。

1\. [Power Apps ホーム](https://make.powerapps.com/) より「詳細設定」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/376c807a-10e6-093f-0a0c-7cfe191a0500.png)

2\. 設定より「カスタマイズ」を選択。※本来カスタマイズはソリューションベースで行う事を推奨。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/9c9a519c-e8eb-b9bd-8279-c1387ccd1ba2.png)

3\.「システムのカスタマイズ」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/79468eff-c64b-aa78-3622-dbf6d7c4c6d5.png)

4\.エンティティより、取引先担当者 | フィールドより「携帯電話」フィールドを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/320a8db0-66dc-d519-7422-6418845c4fbe.png)

5\.「フィールドセキュリティ」を「有効」にして保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/0fc97d13-0e02-08aa-f355-3154df8b2043.png)

6\.「取引先担当者」を選択して「公開」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/f856a3d5-0a1e-b02c-1eb5-f7760d31a98f.png)

# セキュリティプロファイル

次にセキュリティプロファイルを作成します。

1\. 設定より「セキュリティ」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/bce6f2a9-a640-2996-fe71-fc6212784a29.png)

2\.「フィールドレベルセキュリティプロファイル」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c1dc6294-5aec-dae1-ee4e-6d2709d0dc2b.png)

3\.「新規」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ea3d06c5-9cfa-5b03-edee-d1df608ea42e.png)

4\. 名前を付けて「保存」アイコンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/4ee6035d-7fa7-3d66-1b70-3a2d1a01032f.png)

5\.「ユーザー」をクリックして権限を付与するユーザーを追加。ここでは部長を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/40e962c0-c9be-3718-cb8c-3753849f49fc.png)

6\.「フィールドのアクセス許可」を確認。上記手順でフィールドレベルセキュリティを有効にしたフィールドがすべて表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/21c665e1-b750-0d44-7e7a-145a67b07657.png)

7\.「携帯電話」をダブルクリックして開き、「読み込み」と「作成」を「あり」にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/24b5b64e-158c-0f9c-4a43-11db9fed38e5.png)

8\.「保存して閉じる」をクリック。

# データの変更とカスタマイズ

1\. CDS のエンティティより「越安 辰夫 (サンプル)」を編集。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/32cf2886-fdb8-24e2-9084-144315e61266.png)

2\. 携帯番号を編集。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6669223f-340f-a4fc-82ec-548d6fe87529.png)

3\. 次にビューを選択し、「アクティブな取引先担当者」を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/46d8da05-1c1e-4473-6ad1-049999f315e3.png)

4\.「携帯電話」フィールドを追加。「上書き保存」をクリックしてから「公開」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ca99c49f-fa6d-faf3-9aa1-fceaeec0ccce.png)

# 動作の確認

最後に動作を確認します。

1\. アプリに「営業部 部長」でログイン。「アクティブな取引先担当者」で「携帯電話」フィールドの値が見えることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/320a51ae-4ad3-1e70-99d5-9c9a230f4eb6.png)

2\. レコードレベルでも確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6bea343e-7c7e-3a7e-62f0-f1e5b16ec2c9.png)

3\. サインアウトして「第1営業部 営業担当」でログイン。「アクティブな取引先担当者」で「携帯電話」フィールドの値が見えないことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/28599fd1-7ea7-befc-737c-d77ff299f6f6.png)

4\. レコードレベルでも確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b96412ed-b744-9a06-683d-6cf233b3c508.png)

作成や更新についても確認してみてください。

# その他の方法

## エンティティを分離する

フィールドレベルセキュリティは非常に便利ですが、パフォーマンスに影響があります。あるエンティティで多くのフィールドに対してセキュリティが必要となる場合、それらを別のエンティティとして定義して、セキュリティロールで管理した方がいい場合もあります。

## フォームを分ける

セキュリティ機能としては動作しませんが、フォーム上に表示しない程度で運用できる場合、複数フォームを作成して不要なフィールドを非表示にできます。フォームにはセキュリティロールが割り当てできるため、ロールによって見えるフォームを制御できます。

# まとめ

フィールドレベルセキュリティを使う事で、より細かで柔軟なセキュリティが実装できます。またレコード単体や一覧表示だけでなく、データのエクスポートをはじめプラットフォーム全体で一貫した体験を提供することができます。