Newer Version Available
WITH SECURITY_ENFORCED を使用した SOQL クエリの絞り込み
WITH SECURITY_ENFORCED 句を使用して、Apex コードの SOQL SELECT クエリ (サブクエリとクロスオブジェクトリレーションを含む) の項目およびオブジェクトレベルセキュリティ権限を確認できます。
Apex は一般に、システムコンテキストで実行されます。つまり、コード実行時に、現在のユーザの権限、項目レベルセキュリティ、および共有ルールは考慮されません。前のリリースでも項目レベルセキュリティとオブジェクトレベルセキュリティの確認の実行は可能でしたが、この句はクエリ操作の冗長性と技術的な複雑性を大幅に削減します。この機能は、セキュリティを含む開発経験が少ない Apex 開発者と、権限エラーのグレースフルデグラデーションが不要なアプリケーション向けです。
WITH SECURITY_ENFORCED を使用できるのは、SELECT および WHERE SOQL 句に限られます。たとえば、ユーザが LastName 項目のアクセス権を持っている場合は、このクエリにより、Acme 取引先エントリの Id と LastName が返されます。
1List<Account> act1 = [SELECT Id, (SELECT LastName FROM Contacts
2 FROM Account WHERE Name like 'Acme' WITH SECURITY_ENFORCED]
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 を使用することはできません。このクエリでは、取引先オブジェクトと商談オブジェクトで返される特定の項目と、他のすべてのオブジェクトで返される [名前] 項目と [メール] 項目を指定します。
1SELECT 2TYPE OF What 3 WHEN Account THEN Phone 4 WHEN Opportunity THEN Amount 5 ELSE Name,Email 6END 7FROM Event - 多態的な参照項目 Owner、CreatedBy、LastModifiedBy は、この制限から除外され、多態的なリレーションをトラバースできます。
- AppExchange セキュリティレビューでは、WITH SECURITY_ENFORCED を使用するときに API バージョン 48.0 以降を使用する必要があります。機能がベータまたはパイロットだった API バージョンは使用できません。
SOQL SELECT クエリで WITH SECURITY_ENFORCED を使用して参照されている項目またはオブジェクトへのアクセス権限がユーザにない場合、例外が発生し、データは返されません。
例
LastName または Description いずれかの項目アクセスが非表示の場合、次のクエリでは権限が不十分であることを示す例外が発生します。
1List<Account> act1 = [SELECT Id, (SELECT LastName FROM Contacts),
2 (SELECT Description FROM Opportunities)
3 FROM Account WITH SECURITY_ENFORCED]例
Website の項目アクセスが非表示の場合、次のクエリでは権限が不十分であることを示す例外が発生します。
1List<Account> act2 = [SELECT Id, parent.Name, parent.Website
2 FROM Account WITH SECURITY_ENFORCED]例
Type の項目アクセスが非表示の場合、次の集計関数クエリでは権限が不十分であることを示す例外が発生します。
1List<AggregateResult> agr1 = [SELECT GROUPING(Type)
2 FROM Opportunity WITH SECURITY_ENFORCED
3 GROUP BY Type]