Newer Version Available
WITH SECURITY_ENFORCED を使用した SOQL クエリの絞り込み
WITH SECURITY_ENFORCED 句を使用して、Apex コードの SOQL SELECT クエリ (サブクエリとクロスオブジェクトリレーションを含む) の項目およびオブジェクトレベルセキュリティ権限を確��できます。
Apex は一般に、システムコンテキストで実行されます。つまり、コード実行時に、現在のユーザの権限および項目レベルセキュリティは考慮されません。ただし、共有ルールは必ずスキップされるわけではありません。共有ルールを適用するには、必ず without sharing キーワードを使用してクラスを宣言する必要があります。前のリリースでも項目レベルセキュリティとオブジェクトレベルセキュリティの確認の実行は可能でしたが、この句はクエリ操作の冗長性と技術的な複雑性を大幅に削減します。この機能は、セキュリティを含む開発経験が少ない Apex 開発者と、権限エラーのグレースフルデグラデーションが不要なアプリケーション向けです。
WITH SECURITY_ENFORCED は、SELECT および FROM SOQL 句で参照している項目とオブジェクトについてのみ、項目およびオブジェクトレベルのセキュリティチェックを適用します。WHERE や ORDER BY 句からの参照先には適用されません。つまり、セキュリティは、クエリの実行に含まれているすべての要素ではなく、SOQL SELECT クエリが返すものに適用されます。
WITH SECURITY_ENFORCED 句を次のように挿入します。
- WHERE 句がある場合はその前に挿入し、ない場合は FROM 句の後に挿入します。
- ORDER BY、LIMIT、OFFSET、または集計関数句がある場合はその前に挿入します。
たとえば、ユーザが LastName 項目のアクセス権を持っている場合は、このクエリにより、Acme 取引先エントリの Id と LastName が返されます。
WITH SECURITY_ENFORCED を使用して多態的な参照項目を照会するときには、いくつかの制限があります。多態的な項目とは、複数のエンティティを参照できるリレーション項目です。
- 多態的な項目のリレーションのトラバースは、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 が発生し、データは返されません。
例
LastName または Description いずれかの項目アクセスが非表示の場合、次のクエリでは権限が不十分であることを示す例外が発生します。
例
Website の項目アクセスが非表示の場合、次のクエリでは権限が不十分であることを示す例外が発生します。
例
Type の項目アクセスが非表示の場合、次の集計関数クエリでは権限が不十分であることを示す例外が発生します。