Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

PowerApps Portals で問い合わせページを作る ③ エンティティ・ページアクセス許可の設定

前回の記事では一覧画面を作成しました。

今回はその一覧画面に対して、ログインしたユーザーでアクセス範囲を規定する設定を、ポータルを通じて実現してみたいと思います。

docs.microsoft.com

ポータルのアクセスアーキテクチャを知る

まず、重要なアーキテクチャ全体像をおさえておきましょう。

ポータルのロール・アクセス許可周りは、CDSのセキュリティロールとは全く違います。そして、結構要所を抑えないと混乱することが多いです。

この記事でもできる限り安易な説明を心がけていますが、やはり最後にものを言うのは触ってみたかどうかです。

ぜひ概念的な部分も押さえながら、色々と試してみてください。

大前提・ポータルユーザーとは何か?

ポータルのアクセスコントロールを実現するためには、まずアクセス範囲を識別するためのポータルのユーザーとは何か? をおさえておく必要があります。

ポータルユーザーは以下のような画面でユーザー登録もしくは外部サインインをしたユーザーを指します。

f:id:sugimomoto:20190802120854p:plain

f:id:sugimomoto:20190802120904p:plain

その実体は、モデル駆動アプリ(CDS)の「取引先担当者」となっていて、ポータルユーザーの登録が行われると、自動的に取引先担当者がそのポータルユーザーとして登録されます。

f:id:sugimomoto:20190802120916p:plain

また、もう一つ気をつけなければいけない点として「取引先企業」があります。これは、そのログインユーザー(取引先担当者)が所属する「組織」とみなすことができると思いますし、部署やチームと見立ててもいいでしょう。

この「ポータルユーザー(取引先担当者)」とそのユーザーの「所属先(取引先企業)」の2つの要素が中心に存在するとまず考えてください。

f:id:sugimomoto:20190802120928p:plain

ポータルユーザーはどんな区分けでアクセスする際の役割が決まるか? (Webロール)

ポータルユーザーは「Webロール」という役割を持つことが可能です。この「Webロール」に対して、「エンティティのアクセス許可」「Webページアクセス制御ルール」という2種類のアクセス許可を紐付けることで、どんなデータ・どんなページにアクセスが可能か? ということが決まります。

なお、一点注意しておきたいのが、「匿名ユーザー」と「認証されたユーザー」という区分け(Webロール)がデフォルトでは存在するという点です。

「匿名ユーザー」はログインしていないユーザーのアクセス許可を決めており、「ログインしていなくてもこの機能は使えるよー」というものを決定します。

2種類のアクセス許可「エンティティのアクセス許可」「Webページのアクセス許可」を理解する

さて、一番メインとなるアクセス許可の話です。

まず「エンティティのアクセス許可」ですが、その名の通りリストやフォームなどで表示するデータのアクセス範囲・操作可能な処理を決めるための設定になります。

ユーザーはいくつかのWebロールを持つことができ、そのWebロールでどのエンティティにアクセス許可を行うか? という設定持つことが可能です。エンティティのアクセス許可はそれぞれ、「読み取り」「書き込み」「作成」「削除」などの権限を持たせることができ、ロールによって書き込みだけを許容したり、読み取りだけに制限したりすることが可能です。(なお、アクセス内容が重複した場合、権限の強い方、許可されている方が勝ちます)

f:id:sugimomoto:20190802120937p:plain

ただし一点注意しなければいけないことは、エンティティのアクセス許可は、どのユーザーが所有しているか? の情報が含まれていなければいけない点です。

例えば、「営業案件」に紐づく、「見積」および「見積明細」をポータルでユーザーに公開したい、としましょう。また前提として、営業案件はどのポータルユーザーが作成したか? の情報(フィールド)を持っているものの、見積・見積明細は、営業案件に対する関連付けのみで、ポータルユーザーに直接紐付いてはいない、ものとします。

その場合、以下のように3種類の「エンティティのアクセス許可」を構成し、それぞれのエンティティでのアクセス許可を設定した上で、「エンティティのアクセス許可」同士でも親子関係を設定し、営業案件からのアクセス権伝播を可能にする設定を施します。

f:id:sugimomoto:20190802120944p:plain

これにより、どのレコードにどこまでアクセスが可能か? が決定します。

また、前述した取引先企業ですが、自分が所属する取引先企業企業のユーザー同士での営業案件を共有する、みたいな使い方が可能です。

それに対して、Webページアクセス制御ルールはシンプルです。どのロールがどのWebページにアクセスできるかどうか? のみを決定するだけです。

f:id:sugimomoto:20190802120950p:plain

一点注意したいのは、「Webページアクセス制御ルール」を作った時点で、そのWebページには強制的にアクセス制限がかかり、ロールに付与しない限りアクセスできなくなる点ですね。 ただし、「Webページアクセス制御ルール」が設定されていないWebページは全員がアクセスできます。

アクセス許可を利用するために事前準備

今回は「お問い合わせ」というエンティティに対して、ログインしたユーザーだけが自分の投稿した問い合わせを表示できる、というシナリオで構成してみます。

そのためには、「お問い合わせ」のデータに「誰が投稿した問い合わせなのか?」という情報を持たせなければいけません。

そのため、以下のように「お問い合わせ」エンティティで「問い合わせユーザー」というフィールドを追加します。

f:id:sugimomoto:20190802121055p:plain

ただ、これだけでは問い合わせを作成する際に値が空のままになってしまいます。なので、問い合わせフォームで自動的にログインユーザーの情報が登録される設定を追加します。

それが「エンティティフォームメタデータ」という設定になります。ポータル管理のエンティティフォームの画面から追加することができます。エンティティフォームメタデータはフォームに+アルファの機能を付与するための設定という風にとりあえず考えてもらえればOKです。

f:id:sugimomoto:20190802121102p:plain

エンティティフォームメタデータでは、属性(Attribute)を選び、先程作成した「問い合わせユーザー」を選択

f:id:sugimomoto:20190802121108p:plain

そして「保存時に値を設定する」というセクションで、「現在のポータルユーザー」の情報を入力するように設定を行います。

ちょっとわかりづらいですが「開始属性」のところで、ポータルユーザーのGUIDを入力するために「取引先担当者(contactid)」を設定します。

f:id:sugimomoto:20190802121114p:plain

この設定を反映すると、以下のように問い合わせを作成した際に、ログインユーザーの情報が付与されるようになります。

f:id:sugimomoto:20190802121121p:plain

エンティティのアクセス許可を作成

これで事前準備が整いました。それではエンティティのアクセス許可を作成してみましょう。

エンティティのアクセス許可のレコードを追加し、対象のエンティティを「お問い合わせ」エンティティにします。

ログインユーザーの関連性でデータを閲覧できるようにしたいため、「スコープ」は取引先担当者を指定します。

このスコープを指定すると、どのフィールドを対象にするのか、という設定セクション「取引先担当者のスコープ」が出てくるので、作成した関連名を入力します。

f:id:sugimomoto:20190802121137p:plain

特権はそのエンティティに対して、作成や削除などの許可を規定するための設定です。読み取り(表示)・書き込み(更新)・作成・削除はその名前の通りですね。追加・追加先は参照フィールドとして参照可能か、参照されることが可能か、を設定します。

f:id:sugimomoto:20190802121145p:plain

最後にこの権限を紐付けるWebロールを設定します。今回はデフォルトで存在している「認証されたユーザー」のWebロールを紐付けました。

f:id:sugimomoto:20190802121151p:plain

これでエンティティアクセス許可の作成は完了です。

と、これで良さげに見えるのですが、実はこの段階ではまだアクセス許可は行われていません。

エンティティアクセス許可をエンティティフォームとエンティティリストで「有効化」するという作業が必要です。

対象の「お問い合わせ」エンティティを関連付けているエンティティフォーム・エンティティリストで以下のように「エンティティのアクセス許可を有効にする」これにチェックを入れる必要があります。

エンティティフォームではここ

f:id:sugimomoto:20190802121201p:plain

エンティティリストではここですね。

f:id:sugimomoto:20190802121209p:plain

これで晴れて「問い合わせユーザー」の範囲でデータが見えるようになりました。

f:id:sugimomoto:20190802121222p:plain

Webページアクセス制御ルール

データへのアクセス許可はこれで整いましたが、この状態のままだと一覧画面にはそのままアクセスできてしまいます。(データは表示されませんが)

なので次にWebページアクセス制御ルールも追加してみましょう。

同じようにポータル管理から、今度は「Webページアクセス制御ルール」を追加します。

前述の通り、ここで注意したいことは、エンティティのアクセス許可とは違い、「Webページのアクセス制御ルール」はこの定義を作った時点で対象のWebページへのアクセス制限が行われるようになるという点です。

作成の仕方は以下の通りです。新しく「Webページのアクセス制御ルール」のレコードの追加画面に移動し、対象となる「Webページ」を選択、権限は「読み取りの制限」、スコープは「すべてのコンテンツ」でとりあえず作成しましょう。

※補足:「Webページアクセス制御ルール」は実はページそのもののアクセス以外に、ページを外部ユーザーが編集できるかどうか? の権限も設定することが可能です。(CMS的な)そのため、読み取りの制限以外にも色々と設定があるのですが、そこは今回割愛します。

f:id:sugimomoto:20190802121239p:plain

あとは、Webロールから対象のユーザーを指定すればOKです。

f:id:sugimomoto:20190802121247p:plain

この状態でログイン状態のメニューは以下のように「問い合わせ履歴」が表示されていますが

f:id:sugimomoto:20190802121254p:plain

ログインしていない場合は、以下のように「問い合わせ履歴」が表示されません。

f:id:sugimomoto:20190802121304p:plain

おわりに

PowerApps Portalsのアクセス制御は要所を理解しておくことで、とても柔軟にアクセス権を施すことが可能です。

個人的に一番おさえた方がいいと考えるのは、やはり「取引先担当者」の関連性からすべてのアクセス制御が成り立つという点です。

正直色々と触ってみないと、イメージがつかない機能ですので、ぜひいろいろと試してみてください。