Newer Version Available
WITH SECURITY_ENFORCED を使用した SOQL クエリの絞り込み
Apex は一般に、システムコンテキストで実行されます。つまり、コード実行時に、現在のユーザの権限および項目レベルセキュリティは考慮されません。ただし、共有ルールは必ずスキップされるわけではありません。共有ルールを適用させないためには、必ず without sharing キーワードを使用してクラスを宣言する必要があります。前のリリースでも項目レベルセキュリティとオブジェクトレベルセキュリティの確認の実行は可能でしたが、この句はクエリ操作の冗長性と���術的な複雑性を大幅に削減します。この機能は、セキュリティを含む開発経験が少ない Apex 開発者と、権限エラーのグレースフルデグラデーションが不要なアプリケーション向けです。
WITH SECURITY_ENFORCED は、SELECT および FROM SOQL 句で参照している項目とオブジェクトについてのみ、項目およびオブジェクトレベルのセキュリティチェックを適用します。WHERE や ORDER BY 句からの参照先には適用されません。つまり、セキュリティは、クエリの実行に含まれているすべての要素ではなく、SOQL SELECT クエリが返すものに適用されます。
- WHERE 句がある場合はその前に挿入し、ない場合は FROM 句の後に挿入します。
- ORDER BY、LIMIT、OFFSET、または集計関数句がある場合はその前に挿入します。
- 多態的な項目のリレーションのトラバースは、WITH SECURITY_ENFORCED を使用したクエリではサポートされません。たとえば、ユーザエンティティおよびカレンダーエンティティの ID および所有者名を返す次のクエリでは WITH SECURITY_ENFORCED を使用できません。SELECT Id, What.Name FROM Event WHERE What.Type IN (’User’,’Calendar’)。
-
ELSE 句と組み合わせた TYPEOF 式の使用は、WITH SECURITY_ENFORCED を使用したクエリではサポートされません。TYPEOF は任意の多態的なリレーションの種別について返される項目を指定するために SELECT クエリで使用されます。たとえば、次のクエリで WITH SECURITY_ENFORCED を使用することはできません。このクエリでは、取引先オブジェクトと商談オブジェクトで返される特定の項目と、他のすべてのオブジェクトで返される [名前] 項目と [メール] 項目を指定します。
- 多態的な参照項目 Owner、CreatedBy、LastModifiedBy は、この制限から除外され、多態的なリレーションをトラバースできます。
- AppExchange セキュリティレビューでは、WITH SECURITY_ENFORCED を使用するときに API バージョン 48.0 以降を使用する必要があります。機能がベータまたはパイロットだった API バージョンは使用できません。
SOQL SELECT クエリで WITH SECURITY_ENFORCED を使用して参照されている項目またはオブジェクトへのアクセス権限がユーザにない場合、System.QueryException が発生し、データは返されません。
ユーザオブジェクトでオブジェクト権限と項目権限を適用し、Experience Cloud サイトが含まれる組織でユーザの個人情報を他のユーザに非表示にするには、「オブジェクト権限と項目権限の適用」を参照してください。
例
例
例
Type の項目アクセスが非表示の場合、次の集計関数クエリでは権限が不十分であることを示す例外が発生します。