365前回の記事では一覧画面を作成しました。今回はその一覧画面に対して、ログインしたユーザーでアクセス範囲を規定する設定を、ポータルを通じて実現してみたいと思います。docs.microsoft.comポータルのアクセスアーキテクチャを知るまず、重要なアーキテクチャ全体像をおさえておきましょう。ポータルのロール・アクセス許可周りは、CDSのセキュリティロールとは全く違います。要所を抑えないと混乱することが多いです。この記事でもできる限り安易な説明を心がけていますが、やはり最後にものを言うのは触ってみたかどうかです。概念的な部分も押さえながら、色々と試してみてください。おさえておく必要があります。ポータルユーザーは以下のような画面でユーザー登録もしくは外部サインインをしたユーザーを指します。その実体は、モデル駆動アプリ(CDS)の「取引先担当者」となっていて、ポータルユーザーの登録が行われると、自動的に取引先担当者がそのポータルユーザーとして登録されます。一つ気をつけなければいけない点として「取引先企業」があります。これは、そのログインユーザー(取引先担当者)が所属する「組織」とみなすことができると思いますし、部署やチームと見立ててもいいでしょう。この「ポータルユーザー(取引先担当者)」とそのユーザーの「所属先(取引先企業)」の2つの要素が中心に存在するとまず考えてください。(Webロール)ポータルユーザーは「Webロール」という役割を持つことが可能です。いうことが決まります。一点注意しておきたいのが、「匿名ユーザー」と「認証されたユーザー」という区分け(Webロール)がデフォルトでは存在するという点です。「匿名ユーザー」はログインしていないユーザーのアクセス許可を決めており、「ログインしていなくてもこの機能は使えるよー」というものを決定します。2種類のアクセス許可「エンティティのアクセス許可」「Webページのアクセス許可」を理解するさて、一番メインとなるアクセス許可の話です。「エンティティのアクセス許可」ですが、その名の通りリストやフォームなどで表示するデータのアクセス範囲・操作可能な処理を決めるための設定になります。いう設定持つことが可能です。権限を持たせることができ、ロールによって書き込みだけを許容したり、読み取りだけに制限したりすることが可能です。情報が含まれていなければいけない点です。「営業案件」に紐づく、「見積」および「見積明細」をポータルでユーザーに公開したい、としましょう。情報(フィールド)を持っているものの、見積・見積明細は、営業案件に対する関連付けのみで、ポータルユーザーに直接紐付いてはいない、ものとします。その場合、以下のように3種類の「エンティティのアクセス許可」を構成し、それぞれのエンティティでのアクセス許可を設定した上で、「エンティティのアクセス許可」同士でも親子関係を設定し、営業案件からのアクセス権伝播を可能にする設定を施します。前述した取引先企業ですが、自分が所属する取引先企業企業のユーザー同士での営業案件を共有する、みたいな使い方が可能です。それに対して、Webページアクセス制御ルールはシンプルです。一点注意したいのは、「Webページアクセス制御ルール」を作った時点で、そのWebページには強制的にアクセス制限がかかり、ロールに付与しない限りアクセスできなくなる点ですね。「Webページアクセス制御ルール」が設定されていないWebページは全員がアクセスできます。今回は「お問い合わせ」というエンティティに対して、ログインしたユーザーだけが自分の投稿した問い合わせを表示できる、というシナリオで構成してみます。そのためには、「お問い合わせ」のデータに「誰が投稿した問い合わせなのか?」という情報を持たせなければいけません。そのため、以下のように「お問い合わせ」エンティティで「問い合わせユーザー」というフィールドを追加します。これだけでは問い合わせを作成する際に値が空のままになってしまいます。問い合わせフォームで自動的にログインユーザーの情報が登録される設定を追加します。それが「エンティティフォームメタデータ」という設定になります。ポータル管理のエンティティフォームの画面から追加することができます。エンティティフォームメタデータはフォームに+アルファの機能を付与するための設定という風にとりあえず考えてもらえればOKです。エンティティフォームメタデータでは、属性(Attribute)を選び、先程作成した「問い合わせユーザー」を選択そして「保存時に値を設定する」というセクションで、「現在のポータルユーザー」の情報を入力するように設定を行います。わかりづらいですが「開始属性」のところで、ポータルユーザーのGUIDを入力するために「取引先担当者(contactid)」を設定します。この設定を反映すると、以下のように問い合わせを作成した際に、ログインユーザーの情報が付与されるようになります。エンティティのアクセス許可を作成これで事前準備が整いました。それではエンティティのアクセス許可を作成してみましょう。エンティティのアクセス許可のレコードを追加し、対象のエンティティを「お問い合わせ」エンティティにします。ログインユーザーの関連性でデータを閲覧できるようにしたいため、「スコープ」は取引先担当者を指定します。このスコープを指定すると、どのフィールドを対象にするのか、という設定セクション「取引先担当者のスコープ」が出てくるので、作成した関連名を入力します。特権はそのエンティティに対して、作成や削除などの許可を規定するための設定です。読み取り(表示)・書き込み(更新)・作成・削除はその名前の通りですね。追加・追加先は参照フィールドとして参照可能か、参照されることが可能か、を設定します。最後にこの権限を紐付けるWebロールを設定します。今回はデフォルトで存在している「認証されたユーザー」のWebロールを紐付けました。これでエンティティアクセス許可の作成は完了です。これで良さげに見えるのですが、実はこの段階ではまだアクセス許可は行われていません。エンティティアクセス許可をエンティティフォームとエンティティリストで「有効化」するという作業が必要です。対象の「お問い合わせ」エンティティを関連付けているエンティティフォーム・エンティティリストで以下のように「エンティティのアクセス許可を有効にする」これにチェックを入れる必要があります。エンティティフォームではここエンティティリストではここですね。これで晴れて「問い合わせユーザー」の範囲でデータが見えるようになりました。Webページアクセス制御ルールデータへのアクセス許可はこれで整いましたが、この状態のままだと一覧画面にはそのままアクセスできてしまいます。(データは表示されませんが)なので次にWebページアクセス制御ルールも追加してみましょう。同じようにポータル管理から、今度は「Webページアクセス制御ルール」を追加します。前述の通り、ここで注意したいことは、エンティティのアクセス許可とは違い、「Webページのアクセス制御ルール」はこの定義を作った時点で対象のWebページへのアクセス制限が行われるようになるという点です。作成の仕方は以下の通りです。新しく「Webページのアクセス制御ルール」のレコードの追加画面に移動し、対象となる「Webページ」を選択、権限は「読み取りの制限」、スコープは「すべてのコンテンツ」でとりあえず作成しましょう。権限も設定することが可能です。(CMS的な)そのため、読み取りの制限以外にも色々と設定があるのですが、そこは今回割愛します。あとは、Webロールから対象のユーザーを指定すればOKです。この状態でログイン状態のメニューは以下のように「問い合わせ履歴」が表示されていますがログインしていない場合は、以下のように「問い合わせ履歴」が表示されません。Portalsのアクセス制御は要所を理解しておくことで、とても柔軟にアクセス権を施すことが可能です。個人的に一番おさえた方がいいと考えるのは、やはり「取引先担当者」の関連性からすべてのアクセス制御が成り立つという点です。触ってみないと、イメージがつかない機能ですので、ぜひいろいろと試してみてください。(翻訳)Twitter@sugimomotoさんのツイートはてなブログをはじめよう!sugimomotoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。