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

Power Appsのキャンバスアプリで、利用しているユーザーや所属するグループによって動作を変える、権限管理を実現する。

Power Appsのキャンバスアプリで、利用しているユーザーや所属するグループによって動作を変える、権限管理を実現する。

2024年4月27日

PowerAppsSharePointOffice365マイクロソフト

ユーザーによってフォームの状態を切り替える。

PowerAppsのキャンバスアプリを作成することになったのですが、アプリを利用するユーザーによって、フォームのアイテムを入力可/不可に切り替えたいという要件がありました。 複数人で共同管理するデータベースの項目それぞれについて、権限のあるユーザーだけが変更できるようにしたい、という意図です。 ユーザーに対して権限付与すると、そのユーザーがいなくなった時にメンテナンスしなければいけないため、ついでにグループによる権限管理も加えたいと考えました。

SharePointリストで権限を管理する。

キャンパスアプリのフォームで編集するデータはSharePointリストに保管します。テストデータとしてGAFA社長リストを次のように作成しました。

名前年齢職業生年月日
ティム・クック63アップル CEO1960/11/1
マーク・ザッカーバーグ39メタ CEO1984/5/14
ジェフ・ベゾス60アマゾン 会長1964/1/12
サティア・ナデラ56マイクロソフトCEO1967/8/19

サンプルデータのリスト

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

サンプルキャンパスアプリ

利用ユーザーの権限を判断する。

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

権限設定用のSharePointリスト

利用ユーザーの所属グループから権限を判断する。

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

PowerAppsにコネクタを追加

ユーザーに付与された権限のチェック

アプリを利用しているユーザーのメールアドレスは、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)
  )

権限設定をコントロールへ設定

ユーザーおよびグループ単位でチェックした権限にしたがって、フォームの入力項目のDisplayModetrueの場合はDisplayMode.Editへ、falseの場合はDisplayMode.Viewに切り替えます。そうすることで権限がない場合は常に表示モードになり、編集ができなくなります。