Power Appsでユーザーやグループによる権限管理を実現する。

Power Appsのキャンバスアプリで、利用しているユーザーや所属するグループによって動作を変える、権限管理を実現する。
2024年4月27日
ユーザーによってフォームの状態を切り替える。
PowerAppsのキャンバスアプリを作成することになったのですが、アプリを利用するユーザーによって、フォームのアイテムを入力可/不可に切り替えたいという要件がありました。 複数人で共同管理するデータベースの項目それぞれについて、権限のあるユーザーだけが変更できるようにしたい、という意図です。 ユーザーに対して権限付与すると、そのユーザーがいなくなった時にメンテナンスしなければいけないため、ついでにグループによる権限管理も加えたいと考えました。
SharePointリストで権限を管理する。
キャンパスアプリのフォームで編集するデータはSharePointリストに保管します。テストデータとしてGAFA社長リストを次のように作成しました。
| 名前 | 年齢 | 職業 | 生年月日 | 
|---|---|---|---|
| ティム・クック | 63 | アップル CEO | 1960/11/1 | 
| マーク・ザッカーバーグ | 39 | メタ CEO | 1984/5/14 | 
| ジェフ・ベゾス | 60 | アマゾン 会長 | 1964/1/12 | 
| サティア・ナデラ | 56 | マイクロソフトCEO | 1967/8/19 | 

権限管理の前段階として、このリストから自動作成でキャンパスアプリを作成します。

利用ユーザーの権限を判断する。
権限設定についてもSharePointのリストで管理します。権限を付与する対象のユーザーやグループはSharePointの列タイプでユーザーで複数ユーザーまたはグループを設定できるようにします。

利用ユーザーの所属グループから権限を判断する。
PowerAppsでPowerFxのコードを書き、権限設定を実装します。最初にPowerAppsのデータメニューから必要なコネクタを追加します。先に作ったGAFA社長権限リストとOffice365ユーザー、Office365グループ合計3つのコネクタを追加します。

ユーザーに付与された権限のチェック
アプリを利用しているユーザーのメールアドレスは、Office365ユーザーコネクタのMyProfile()メソッドで取得できます。
Office365ユーザー.MyProfile().Mail
また、GAFA社長権限リストから項目の入力許可を与えられたユーザーおよびグループを取得するのは、Filter関数やFirst関数を使います。Filter関数だけだと結果がテーブル型のデータになってしまうため、First関数で1行のみ取り出しています。
First(
  Filter(
    GAFA社長権限,タイトル = "年齢"
  )
).'許可ユーザー/グループ'
これら2つのコードを組み合わせて、GAFA社長権限リストの許可ユーザー/グループから各ユーザー/グループのメールアドレスをForAll関数で取り出します。
最後にin演算子をつかって利用ユーザーのメールアドレスが含まれているか確認すれば、OKです。
Office365ユーザー.MyProfile().Mail in 
ForAll(
  First(
    Filter(
      GAFA社長権限,タイトル = "年齢"
    )
  ).'許可ユーザー/グループ',Email
)
ユーザーが所属するグループによる権限のチェック
ユーザー自身の権限チェックと同様に許可ユーザー/グループ列に含まれている項目と利用ユーザーが所属するグループを比較します。許可グループが1件でも含まれていたら、true in ForAll~がtrueとなります。
true in ForAll(
  First(
    Filter(
      GAFA社長権限,タイトル = "年齢"
    )
  ).'許可ユーザー/グループ',
  ThisRecord.Email in 
    ForAll(
      Office365グループ.ListOwnedGroupsV2().value,
      ThisRecord.mail)
  )
権限設定をコントロールへ設定
ユーザーおよびグループ単位でチェックした権限にしたがって、フォームの入力項目のDisplayModeをtrueの場合はDisplayMode.Editへ、falseの場合はDisplayMode.Viewに切り替えます。そうすることで権限がない場合は常に表示モードになり、編集ができなくなります。