Apex での共有ルールのスキップ
Apex コードでは、プロファイルベースの権限、項目レベルのセキュリティ、共有ルール、組織全体のデフォルトを順守します。
Salesforce Platform は、データ共有ルールを広範囲に使用します。各オブジェクトは、どのユーザーおよびプロファイルがそのオブジェクト種別のレコードを参照、作成、編集、削除できるかを示す、一意の権限を持つことができます。これらの制限は、コードで標準コントローラーを使用しているときに適用されます。
ただし、カスタム Apex クラスまたは Visualforce ページは、組み込みプロファイル権限、項目レベルのセキュリティ制限、共有ルールをもともと順守しません。デフォルトでは、Apex クラスは組織内のすべてのデータを参照および更新できます。
Apex コードで非表示の機密データをユーザーにさらさないでください。プロファイルベースの権限、項目レベルのセキュリティ、共有ルール、組織全体のデフォルトを順守します。
共有を正しく適用するには、次の一般的なルールに従います。
- すべてのグローバルクラス、または @NamespaceAccessible メソッドを含むクラスで with sharing を宣言します。共有宣言を省略しないでください。また、ソリューションへのこれらの EntryPoint で without sharing を使用しないでください。
- グローバルではないコントローラークラス、または @NamespaceAccessible とマークされていないコントローラークラスでは、クラスを with inherited sharing または with sharing として宣言します。共有宣言を省略しないでください。また、ソリューションへのこれらの EntryPoint で without sharing を使用しないでください。
- データアクセス操作を直接実行するすべてのクラスを with sharing として宣言します。ソリューションのクラスが without sharing とマークされていない場合は、with inherited sharing を使用することもできます。
ただし、注意すべき例外がいくつかあります。次の場合は、一般的なルールに従わないでください。
- サイトまたはコミュニティを作成しており、ゲストユーザーによるデータへのアクセスを拒否したい。
- 特注のセキュリティポリシーを使用して、名前空間に属しているカスタムオブジェクトにアクセスしている。この場合は、AppExchange セキュリティレビュー申請ドキュメントの一部として、ポリシーを文書化します。この例外は、標準オブジェクトには適用されません。組織のシステム管理者は、標準オブジェクトのセキュリティポリシーを単独で所有します。
Apex の例
次の Apex コードでは、クラスのヘッダーに with sharing キーワードが追加されていません。デフォルトでは、共有ルールは適用されません。
1public class maincontroller {
2 @AuraEnabled public static String saveJobApplication(String vacId, String userId) {
3 ...
4 }
5}次の Apex コードでは、with sharing キーワードが使用されています。共有ルールが適用されます。
1public with sharing class maincontroller {
2 @AuraEnabled public static String saveJobApplication(String vacId, String userId) {
3 ...
4 }
5}共有ルールの適用についての詳細は、Trailhead の「Secure Server-Side Development module (セキュアなサーバーサイド開発モジュール)」を確認してください。