レコードへのアクセスの制御
学習の目的
レコードレベルセキュリティ
- ユーザーがアクセスする必要があるのは、すべてのレコードか、それともサブセットのみか?
- サブセットの場合、ユーザーがアクセスできるかどうかを決定するルールは何か?
サンプルの社員募集アプリケーションで、採用担当者に必要なオブジェクトレベルの権限を付与するために、Recruiter という新しいプロファイルを作成するとします。採用関連のオブジェクトを削除する機能を制限して、採用担当者がこれらのオブジェクトを削除できないようにします。ただし、採用担当者に採用オブジェクトを作成、参照、編集する権限を付与しても、必ずしも採用担当者が採用オブジェクトのすべてのレコードを参照または編集できるわけではありません。それは、次の 2 つの重要な概念があるためです。
- レコードに対する権限は常に、オブジェクトレベル、項目レベル、レコードレベルの権限を組み合わせて評価される。
- オブジェクトレベルの権限とレコードレベルの権限が矛盾する場合は、制限が厳しい方の設定が優先される。
- 組織の共有設定 — 相互のレコードに対するユーザーのデフォルトのアクセスレベルを指定します。
- ロール階層 — マネージャーには常にその部下と同じレコードへのアクセス権を付与します。階層の各ロールは、ユーザーまたはユーザーグループが必要とするデータアクセスのレベルを表します。
- 共有ルール — 特定のユーザーグループに対して組織の共有設定の例外を自動的に作成して、所有していないレコードや通常は参照できないレコードへのアクセス権を付与します。
- 共有の直接設定 — レコード所有者が、レコードへのアクセス権がないと思われるユーザーに参照および編集権限を付与できるようにします。

- オブジェクトに対するユーザーのベースラインの権限は、プロファイルによって決定される。
- ユーザーに権限セットが割り当てられている場合は、権限セットにプロファイルを組み合わせてベースラインの権限が設定される。
- ユーザーが所有しないレコードに対するアクセス権は、まず組織の共有設定によって設定される。
- 組織の共有設定が [公開/参照・更新可能] より低いものである場合は、ロール階層を使用して特定のロールにアクセスを許可できる。
- 共有ルールを使用して、追加のユーザーグループに対してアクセス権を拡張できる。
- 各レコード所有者はレコードの [共有] ボタンを使用して、個別のレコードを直接他のユーザーと共有できる。
プロファイルと権限セットを使用してオブジェクトレベルおよび項目レベルのアクセス権を設定する方法についてはすでに説明しました。次に、各種のレコードレベルのセキュリティコントロールについて詳述します。
組織の共有設定
- このオブジェクトで最も制限されたユーザーは誰か?
- このオブジェクトにこのユーザーに閲覧を許可しないインスタンスがあるか?
- このオブジェクトにこのユーザーに編集を許可しないインスタンスがあるか?

答えに応じて、オブジェクトの共有モデルを次の設定のいずれかにできます。
非公開レコードの所有者と階層内でそのロールの上位にあるユーザーのみが、レコードに対して参照、編集、およびレポートを実行できます。
公開/参照のみ
すべてのユーザーはレコードに対して参照とレポートを実行できますが、レコードの所有者と階層内でそのロールの上位にあるユーザーのみがそのレコードを編集できます。
公開/参照・更新可能
すべてのユーザーがレコードすべてに対して参照、編集、およびレポートを実行できます。
親レコードに連動
ユーザーは、レコードに対して参照、編集、削除を実行できます。この操作ができるかどうかは、ユーザーがそのレコードが属するオブジェクトに対して同様の操作ができるかどうかに基づいています。
オブジェクトの組織の共有設定が [非公開] または [公開/参照のみ] の場合、システム管理者は、ロール階層を設定するか共有ルールを定義することで、ユーザーにレコードに対する追加のアクセス権を付与できます。共有ルールは、追加のアクセス権を付与するためにのみ使用できます。組織の共有設定によって最初に定められた範囲を越えてレコードへのアクセス権を制限するために、共有ルールを使用することはできません。
例として、社員募集アプリケーションの Position (職種) オブジェクトについて上記の質問の答えを考えてみましょう。
このオブジェクトで最も制限されたユーザーは誰か?標準従業員プロファイルのメンバー。許可されるのは職種の参照のみです。
このオブジェクトにこのユーザーに閲覧を許可しないインスタンスがあるか?
いいえ。標準従業員には、給与の最小値と最大値の項目が表示されませんが、すべての職種レコードを参照できます。
このオブジェクトにこのユーザーに編集を許可しないインスタンスがあるか?
はい。標準従業員は、職種レコードを編集できません。
3 つ目の質問への答えが「はい」ですから、Position (職種) オブジェクトの共有モデルは [公開/参照のみ] に設定する必要があります。他の採用オブジェクトについても同じ作業を繰り返すことによって、オブジェクトに適した組織の共有設定を簡単に決定できます。Standard Employee (標準従業員) プロファイルは、各オブジェクトに対する制限が最も厳しいユーザーです。応募者レコード、求人応募レコード、審査レコードを特定の従業員が参照できないようにします。そのため、Candidate (候補者) オブジェクト、Job Application (求人応募) オブジェクト、Review (審査) オブジェクトの共有モデルはすべて [非公開] に設定する必要があります。
組織の共有設定の設定
- [設定] から、[クイック検索] ボックスに「共有設定」と入力し、[共有設定] を選択します。
- [組織の共有設定] 領域で [編集] をクリックします。
一部の標準オブジェクトは、組織の共有設定の異なるオプションを使用します。カスタムオブジェクトの組織の共有設定のオプションには、[非公開]、[公開/参照のみ]、[公開/参照・更新可能] があります。
- オブジェクトごとに、デフォルトの内部アクセス権とデフォルトの外部アクセス権を選択します。
- 階層を使用した自動アクセス権を無効にするには、デフォルトアクセス設定が [親レコードに連動] ではない [階層を使用したアクセス許可] をオフにします。
[階層を使用したアクセス許可] がオフになっている場合でも、「すべての参照」や「すべての編集」オブジェクト権限、「すべてのデータの参照」や「すべてのデータの編集」システム権限などを持っているユーザーは、自分が所有していないレコードにもアクセスできます。
もうひとこと...
Apex による共有管理により、開発者はプログラムでカスタムオブジェクトに関連付けられているレコードを共有できます。Apex による共有管理を使用してカスタムオブジェクトを共有した場合は「すべてのデータの編集」権限を持つユーザーのみがそのカスタムオブジェクトのレコードに対する共有を追加または変更できます。共有アクセス権は、レコード所有者が変わってもそのままです。詳細は、「Apex 共有」を参照してください。