Salesforceでは、あるレコードを参照できる人・できない人のセキュリティ制御が可能です。
標準機能のグローバル検索やビュー・レポートの結果も参照できるレコードのみで表示されるし、URLを直接変更されて参照できないレコードのIDを指定されてもアクセスできないようになっています。
そのレコードを参照できる人・できない人の設定は次があります。
共有設定
セキュリティ制御の代表です。「セキュリティのコントロール>共有設定」で、
- 公開・非公開
- 階層を使用したアクセス許可
- 非公開にした場合の共有ルール(所有者ベース・条件ベース)
が可能です。
階層を使用したアクセス許可をすると、ロール階層で、より上位の人はアクセスできるようになります。
取引先や、商談、ケースなどは階層を使用したアクセス許可のチェックが外せないので、そのレコードを参照できる人の上位ロールの人にはレコードが参照できるようになっています。
どうしても、取引先や、商談、ケースなどで上位のロールの人にアクセスさせたくない場合、
- 公開グループ(グループAとする)を用意する。
- グループAの「階層を使用したアクセス許可」のチェックを外す
- レコードの参照・編集権をグループAに付与する
- あるユーザ(ユーザ甲とする)には参照させたいけど、ユーザ甲の上位ロールのユーザには見せたくない場合、ユーザ甲をグループAのメンバーにする。
という制御が可能です。(これは、取引先や、商談、ケースだけでなく、階層を使用したアクセス許可にしつつ、階層を使用したくない時があるオブジェクトで有効です)
ロール
商談やケースを非公開にすると、ロール作成時に共有設定とは別のアクセス権の設定が可能です。
最初は商談やケースを公開にした状態で開発を進めていき、途中から非公開に変更した場合に、この設定を忘れやすいので注意です。
取引先チーム・商談チーム・ケースチーム
標準オブジェクトには便利なアクセス制御の仕組みが用意されています。
公開ボタン(手動設定)
ユーザへ委ねる仕組みです。所有者の上位ロールの人にもボタンは表示されます。
ルール化できないようなアクセス制御はこれを使う事になります。
キュー
レコードの所有者にキューを指定すると、そのキューのメンバーはアクセス権が付与されます。(引き受けるの機能はキューとワンセットの機能です)
取引先や商談など、キューが使えないようになっているものもあります。
Apex開発(バッチやトリガ)
共有オブジェクト(末尾にShareがつく)に直接レコードを操作することで複雑なアクセス権の制御ができます。
上のApex共有の理由とワンセットで実装するもので、作成したApex 共有の理由は、共有オブジェクトの、テリトリー割り当て方法(RowCause)の選択リスト値として使うことができます。
番外編 共有セット
今までのアクセス権の設定とは別に、コミュニティ向けのデータ共有の仕組みで共有セットが用意されています。(以前は大規模コミュニティは共有セットでしたが、最近はコミュニティのバリエーションの中で共有セットを使うものがあるようです)
共有セットの仕組みは、所有者のプロファイルがそのコミュニティのプロファイルの場合に、指定した内部ユーザへアクセス権を付与する仕組みです。所有者のプロファイルがコミュニティユーザのプロファイルのままでは、内部ユーザ間の共有ルールのアクセス制御は有効にならないので注意が必要です。
最後に
プロファイルのすべてのデータの参照や編集などは割愛していますが、Salesforceのアクセス制御はとても充実してるなーと感じています。その代わり設定するのは大変ですが。。
さらにVisualforceなどの開発した画面では、apex class での without sharing で、レコードのアクセス権関係無しにデータを取得することもできます。
用意されてる仕組みを利用すれば複雑な仕様も実現できます。が、誰にでもわかりやすいシンプルなルールにしておくのが一番かなーと思っています。