Experience Cloudのアクセス制御

# はじめに

この投稿はSalesforce Advent Calendar 2023の18日目の記事です。
今年も投稿させていただきます。

https://qiita.com/advent-calendar/2023/salesforce

最近になって、Experience Cloud特有のアクセス制御について、学び直しました。今までExperienceCloudでの外部サイト構築案件は担当してきましたが、思ったより新たに学べることがも多く、せっかくなので記事に残したいと思います。

# Experience Cloud特有のアクセス制御の概要
前提として、Experience Cloudは、ユーザー数が大規模になることも多いので、大規模ユーザーにも対応できる、特別なアクセス制御の仕組みが用意されています。
また、内部ユーザーのユースケースにないような、外部ユーザーならではのユースケースに合わせたアクセス制御が標準機能として設定可能です。

余談ですが、私の先輩がその昔に、Experience Cloudのアクセス制御できる独自機能を知らずに、同じような機能をコード開発で実現しようとしたことがあるとかないとか。
Experience Cloudで用意されているアクセス制御を事前に知っていれば、開発をせずとも要件に合わせて、設定だけでレコードアクセス制御が可能です。

### Salesforce共通の機能
Salesforce共通の機能としては、主に下記の設定・機能があります。
*- 共有設定*
*- 共有ルール*
*- ロール階層*
*- 手動共有*
*- Apex共有*

### Experience Cloudの独自機能
Experience Cloudの独自機能として、今回は5つのExperience Cloud独自のアクセス制御について、それぞれまとめていきます。

##### 共有セット

##### 外部取引先階層

##### 取引先リレーションと取引先リレーションデータ共有ルール

##### チャネルプログラム

##### スーパーユーザー

それぞれ詳しくみていきましょう。
※ライセンスによって使える使えないはありますので、併せて記述します。

# 共有セット
「共有セット」は、取引先レベルでレコードへのアクセス制御を行う機能です。
分かりやすく表現すると「自分が所属するレコードはすべて参照できる」、という考え方です。

取引先または取引先責任者に紐づくユーザー同士で、取引先、取引先責任者、その他のオブジェクトのレコードを共有することが可能です。 レコード所有者を起点にするのではなく、外部ユーザーに紐づく取引先責任者を起点に行われます。

共有セットは、全てのExperience Cloudライセンスで、利用可能です。 

さて、「共有セット」はなぜ必要なのでしょうか。
共有セットは、先ほどあげたようなSalesforce通常の共有モデルとは、別の機能です。
また、通常の共有モデルほどの柔軟なアクセス制御はできません。 

Salesforceでは、組織の共有設定により、各オブジェクトに対するベースラインレベルのアクセス権が決定されます。ユーザーのお互いのレコードに対して、デフォルトのアクセス制御を設定できます。

そして、内部ユーザーに対して、ロール、公開グループを用いた 「共有ルール」を使用して、組織の共有設定で制限されたアクセス権を拡張します。

しかし、カスタマーコミュニティライセンスをはじめとした一部の外部ユーザのライセンスでは、ロールを設定することができず、共有ルールに含めることができません。

なので、共有ルールに含めることが出来ない外部ユーザーに対しては、 共有セットを使用してアクセス権の制御を行えます。
そもそも、全顧客分のロール設定するのは、現実的ではないですね。
くわえて、Customer Communityライセンスでは、ロールモデルに対応していなかったりします。

https://help.salesforce.com/s/articleView?id=sf.networks_setting_light_users.htm&type=5


# 外部取引先階層
2つ目は「外部取引先階層」です。
外部取引先階層は、取引先と取引先の間に、何かしらの上下関係をつくりたいときに使う機能です。

外部取引先階層は、Customer Communityライセンスでは利用できず、Customer Community PlusライセンスとPartner Communityライセンスで利用できます。

外部ユーザーが紐づく取引先を階層化し、ロール階層のように上位階層にレコードを共有します。 

ユースケースとしては、代理店親会社が、代理店小会社以下の売上状況を管理しているとします。
もちろん代理店親会社は、代理店小会社以下の売上を参照可能にしたいです。しかし、二次代理店同士のお互いの売上は参照させたくない場合などの取引先階層で管理できます。

##### 制限事項
*- 最大5階層まで可能。*
*- 個人取引先は利用不可。*
*- 各取引先には少なくとも1つのロールが必要。取引先ロールの最適化で紐付いたロールは利用不可。*
*- 1つの階層は同じライセンスで構成されている必要あり。*
*- 1つの取引先は、1つの階層にしか所属できない。*
*- 階層に参加できる取引先は、最大100,000レコードまで。*

https://help.salesforce.com/s/articleView?id=sf.networks_external_account_hierarchies.htm&type=5

# 取引先リレーションと取引先リレーションデータ共有ルール
3つ目は「取引先リレーションと取引先リレーションデータ共有ルール」です。
ざっくり言うと、「ある取引先から別の取引先に、アクセス権を与える」という考え方です。

「取引先リレーションデータ共有ルール」を使用すると、レコードを外部取引先と共有するために使用する条件を定義できます。データ共有ルールは、リレーション種別、共有される情報、およびアクセス権を取得している取引先に付与されるレコードアクセス権を定義します。

上記データ共有ルールを作成したら、「取引先リレーション」を作成し、外部取引先と共有できます。「取引先リレーション」は、情報を共有している取引先、それらのレコードにアクセスしている取引先、およびそれらのリレーションの種別で構成されます。

つまり、「どのレコードを共有するか」をデータ共有ルールを定義して、「誰に対してアクセス権を与えるか」を取引先リレーションで作成するイメージです。

「取引先リレーション」も、Customer Communityライセンスでは利用できず、Customer Community PlusライセンスとPartner Communityライセンスで利用できます。

https://help.salesforce.com/s/articleView?id=sf.networks_partner_account_relationships_and_sharing.htm&type=5

# チャネルプログラム

取引先をグルーピングして、そのグループ毎に権限を与える考え方です。

チャネルプログラムは、Partner Communityライセンスで利用できます。
チャネルプログラム管理用の、下記3つの標準オブジェクトがPartner Communityライセンスに提供されます。

###### チャネルプログラム
パートナーを種別または場所でグループ化します。
複数のチャネルを持つセールス組織を整理することができます。例えば、再販業者（リセラー、各パートナー）など、さまざまな種別のパートナーユーザー用にプログラムを作成できます。パートナーユーザーを地域別または専門知識のレベル別に編成することも可能です。

##### プログラムレベル
各プログラム内のレベルを作成して、パートナーを順位やランクで整理します。
プログラム内に複数のレベル（ブロンズ、シルバー、ゴールドなど）を作成し、各パートナーユーザーをパフォーマンスに基づいて 1 つのレベルに割り当てます。レベルごとに異なるインセンティブを提供できます。

##### チャネルプログラムメンバー
チャネルプログラムと取引先を多対多で結ぶ連結オブジェクトです。

チャネルプログラムおよびレベルを使用して、チャネルパートナーの整理や管理を行います。
各プログラム内でパートナーをさまざまなレベル (ブロンズ、シルバー、ゴールドなど) にグループ化し、パフォーマンスに基づいてパートナーを昇格させられます。
また、共有グループ、利用者ターゲティング、共有設定を使用して、プログラムまたはレベルに基づいてリソースへのアクセスを管理します。


# スーパーユーザー
さいごの5つ目は、「スーパーユーザー」です。
その名前の通り、取引先の中で「特別な権限を持つユーザー（外部の特権ユーザー）」です。

スーパーユーザーは、Customer Community PlusライセンスとPartner Communityライセンスで挙動が異なりますので、それぞれ解説します。

### Customer Community Plusライセンス
Customer Community Plusライセンスの場合は、ポータルスーパーユーザーと呼びます。

設定方法は、権限セットで割り当てを行います。
[アプリケーション権限] セクションで、「ポータルスーパーユーザー」権限を追加します。「ポータルスーパーユーザー」権限を権限セットに追加し、Customer Community Plusユーザーに割り当てます。

対象オブジェクトは非常に限定的で、ケース、取引先責任者のみです。

ですが、スーパーユーザーは、上階層ロール、同階層ロール、下階層ロールに関係なく、自分の取引先に紐づく全てのレコードにアクセス可能となります。

https://help.salesforce.com/s/articleView?language=ja&id=sf.networks_customer_super_user_access.htm&type=5

### Partner Communityライセンス
Partner Communityライセンスの場合は、パートナースーパーユーザーと呼びます。

設定方法は、Lightningを使用している場合、デジタルエクスペリエンス設定で [パートナースーパーユーザーアクセスを有効化] 設定を選択して、 ドロップダウンメニューをクリックし、パートナースーパーユーザーを有効化します。

対象オブジェクトはケース、リード、商談、カスタムオブジェクトが対象です。

自分と同階層ロールにいるユーザー以下のレコードにアクセス可能です。上階層ロールにはアクセスできませんが、通常のロールと違って、同じ階層にもアクセスできるのがポイントです。

https://help.salesforce.com/s/articleView?id=sf.networks_partner_super_user_access.htm&type=5

# さいごに
あらためて、Experience Cloudのアクセス制御は独特だと感じました。
下記、まとめです。

##### 共有セット
*-所属する取引先内で全員が共有*

##### 外部取引先階層
*-取引先を階層化し、上位階層に共有*

##### 取引先リレーションと取引先リレーションデータ共有ルール
*-取引先から取引先へ共有*

##### チャネルプログラム
*-取引先をグループ化して、共有するレコード、グループを選択*

##### スーパーユーザー
*-取引先内で特権アクセスを付与*

さいごまでご覧いただき、ありがとうございました！
自分もまだ使っていない機能がありましたので、機会があれば、実際にSandboxなどで試していきたいと思います。