Communityユーザーのレコードアクセスコントロールをまとめる

Salesforce Communityまわりのアクセスコントロールについて整理された情報を探したのだが、見当たらなかったので調査がてら作成した。

まとめた結果は次の表の通り。

所有者 共有先 共有ルール(所有者) 共有ルール(条件) Apex Sharing 共有セット 共有グループ キュー 公開グループ
内部 内部 × ×
内部 Partner × ×
内部 Plus × ×
内部 無印 × × × × × ×
Partner 内部 × ×
Partner Partner × ×
Partner Plus × ×
Partner 無印 × × × × × ×
Plus 内部 × ×
Plus Partner × ×
Plus Plus × ×
Plus 無印 × × × × × ×
無印 内部 × × × × ○ ※1 ×
無印 Partner × × × × ○ ※1 ×
無印 Plus × × × × ○ ※1 ×
無印 無印 × × × × × ×

内部⇒Sales CloudやService Cloud等のライセンスを持った社内ユーザー。
Partner⇒Partner Communityライセンス。
Plus⇒Customer Community Plusライセンス。
無印⇒Customer Communityライセンス。勝手に無印と呼んでいる。

※1 所有者をキューにすることは可能だが、当然ながらそのままだと無印からはアクセス権が無くなる

以降は解説やら補足やら何やらの蛇足となります。

Communityライセンス種別

Salesforce Communityのライセンスは現時点で以下の4種類。

  • Customer Community(表上は無印)
  • Customer Community Plus(表上はPlus)
  • Partner Community(表上はPartner)
  • Employee Community(ロールが使えてPlusやPartnerと同じなので今回は省略)

(わりとよくライセンスの名前や体系が変わるので注意が必要だ!)

解説

前提として今回はあくまでレコードの共有設定の話しであり、プロファイルや権限セットでのオブジェクトのCRUDは別の話しとする。

そもそもCommunity周りのアクセスコントロールを分かりづらいくしているのが、大規模コミュニティユーザー(無印)の存在だ。
他のCommunityライセンス(Partner,Plus)では、外部ユーザーを作ったタイミングで取引先の所有者の下に外部ユーザー用のロールが生成される。

例えば次の例では営業部1課に所属する内部ユーザが「昭和株式会社」と「平成株式会社」という取引先を所有している。
この取引先の取引先責任者としてCustomer Community Plusのユーザを作成すると、営業部1課ロールの配下としてデフォルト3つの外部ユーザー用ロールが生成されるのだ。



これらはCommunityの前身がPortalであるため、Salesforceの設定上は「ポータルロール」と表示されるが、共有ルール等でも使えるので、内部ユーザーのロールとほぼ同じように共有設定をすることができる。
もちろん運用の中で頻繁にポータルロールが増える場合、共有設定を管理者が毎回実施できるかというのは別の問題はある。

これに対して大規模コミュニティユーザーはポータルロールが生成されない。
Salesforceのパフォーマンスに影響を与える1つの要素として、ロール階層の計算によるアクセスチェックがあるが、大規模ユーザーはこの影響を軽減させる為にロールが存在しないらしい。
ロールが存在しないので、Salesforceで通常レコードへのアクセスコントロールを制御する共有ルールが使えないわけだが、代わりに共有セットや共有グループという仕組みを使ってアクセスコントロールを行う。
ここにさらに内部⇒外部や外部⇒内部という方向、あるいは外部ユーザでもCommunityライセンスが複数絡んでくるとアクセスコントロールは何が使えるんだっけ?となってしまうのだ。

そんな混乱の日々も今回まとめを作ったので「あぁ、それ?テックブログに書いてあるよ。」と言えるようになったので安心である。

表の各列の説明

共有ルール

Salesforceお馴染み共有設定で、所有者ベースで共有先のロールやグループを指定する方法とレコードの条件ベースで共有先を指定することができる。
先述した通り無印はロールが存在しないので、共有先を無印にする場合には使えない。

Apex Sharing

レコードのSharingオブジェクトに共有を指定する方法。詳しくはこちら
無印でも出来ると勘違いしがちだが、無印はレコードへの直接共有ができないのでShareオブジェクトで共有することもできない。

共有セット

無印のユーザーにレコードへのアクセス権を与える場合に使う。
ただし、対象のオブジェクトが取引先や取引先責任者へのリレーションを持っている必要がある。わりとややこしい。詳しくはこちら
あくまでロールを持たない無印などの大規模ユーザー向けなので、ロールを持つ内部ユーザや他Communityライセンスでは使えない。

共有グループ

無印ユーザーが所有するレコードを他ユーザーに共有する場合に使う。
共有セットとの関係がややこしいが、共有セットが無印への共有、共有グループが無印からの共有だ。
設定箇所のUIもすこぶる分かりづらい。


ちなみに共有セットと異なり「参照のみ」という設定が見当たらず、そのまま共有したら編集権限も付与された。

キュー、公開グループ

キューや公開グループ自体は共有を貼る仕組みではなく、あくまでユーザーをグルーピングする仕組である。
つまり作ったグループを共有ルールに指定したり、キューを所有者にしてアクセス権を付与する仕組みだ。
なぜ今回の表に入れたかと言うと、無印ユーザーをキューやグループに入れて共有ルールとかでアクセス権付与できないかと思ったからだ。
だが残念ながら、キューや公開グループの作成画面で無印ユーザーが出てこなかったので目論見は泡と消えた。

まとめ

ということでCommunity周りのアクセスコントロールについてまとめてみました。

なお、本記事はSalesforce App Cloud Advent Calendar 2016の5日目の記事となっています。