この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

stripInaccessible メソッドによる項目レベルセキュリティの適用 (パイロット)

stripInaccessible メソッドを使用して、項目レベルのデータ保護を適用します。このメソッドを使用してクエリ結果からユーザがアクセスできない項目を除外できます。また、このメソッドを使用して、DML 操作の前にアクセスできない項目を sObject から削除して例外を回避し、信頼されないソースから非逐次化された sObject を適切な状態にすることもできます。

このパイロット機能は、パイロットプログラムとして自動的に Sandbox 組織、開発者組織、スクラッチ組織で使用できます。この機能は変更される可能性があり、パイロット期間中は本番組織で使用できません。パイロットプログラムは変更される可能性があり、参加は保証されません。この機能は、Salesforce がドキュメント、プレスリリース、または公式声明で正式リリースを発表しない限り、正式リリースされません。特定期間内の正式リリースあるいはリリースの有無は保証できません。現在正式にリリースされている製品および機能に基づいて購入をご決定ください。この機能に関するフィードバックや提案は、IdeaExchange の「Security.stripInaccessible」グループに投稿してください。

メモ

項目レベルのデータ保護には、Security および SObjectAccessDecision クラスを介してアクセスします。アクセス権チェックは、指定された操作 (作成、読み取り、または更新) のコンテキストにおける現在のユーザの項目レベルの権限に基づきます。stripInaccesible メソッドは、ソースレコードに現在のユーザの項目レベルセキュリティチェックに失敗した項目がないかを確認し、sObject のリストを作成します。返されるリストは、現在のユーザがアクセスできない項目が除外されている以外は、ソースレコードと同じです。getRecords メソッドによって返される sObject には、stripInaccessible メソッドの sourceRecords パラメータ内の sObject と同じ順序でレコードが含まれています。照会されない項目は、例外が発生することなく、戻りリストで null になります。

結果に DML を実行したときに問題が発生しないように、ID 項目は stripInaccessible メソッドによって削除されることはありません。

メモ

削除されたアクセスできない項目を特定するには、isSet メソッドを使用できます。たとえば、戻りリストには取引先責任者オブジェクトが含まれおり、カスタム項目 social_security_number__c はユーザからアクセスできません。このカスタム項目は、項目レベルのアクセスチェックに失敗するため、項目が設定されず、isSetfalse を返します。

1SObjectAccessDecision securityDecision = Security.stripFields(sourceRecords);
2Contact c = securityDecision.getRecords()[0];
3System.debug(c.isSet('social_security_number__c')); // prints "false"

stripInaccessible メソッドを使用可能ないくつかの例を次に示します。

この例によって、アクセスできない項目がクエリ結果から削除されます。キャンペーンデータの表示テーブルには、常に BudgetedCost を表示する必要があります。ActualCost は、この項目を読み取る権限を持つユーザのみに表示される必要があります。
1Security.SObjectAccessDecision securityDecision = Security.stripInaccessible(
2AccessType.READABLE,
3[SELECT Name, BudgetedCost, ActualCost from Campaign];
4);
5
6// Construct the output table
7    if (securityDecision.getRemovedFields().get('Campaign').contains('ActualCost')) {
8        for (Campaign c : securityDecision.getRecords()) {
9        // Output: Name, BudgetedCost
10        }
11    } else {
12        for (Campaign c : securityDecision.getRecords()) {
13        // Output: Name, BudgetedCost, ActualCost
14        }
15}

この例によって、DML 操作の前に、アクセスできない項目が sObjects から削除されます。取引先の OwnerID を作成する権限を持っていないユーザでも、取引先を作成できます。このメソッドは、アカウントの所有者が設定されておらず、例外がスローされていないことを確認します。
1List<Account> newAccounts = new List<Account>();
2Account a = new Account(Name='Acme Corporation');
3Account b = new Account(Name='Blaze Comics', OwnerId=UserInfo.getUserId());
4newAccounts.add(a);
5newAccounts.add(b);
6
7SObjectAccessDecision securityDecision = Security.stripInaccessible(
8AccessType.CREATABLE,
9newAccounts);
10
11// No exceptions are thrown and no Account Owners are set
12insert securityDecision.getRecords();
13
14System.debug(String.join(securityDecision.getRemovedFields().get('Account'), ', ')); // Prints "OwnerID"
15System.debug(String.join(securityDecision.getModifiedIndexes(), ', ')); // Prints "1"

この例では、信頼されないソースからの並列化された sObject をサニタイズします。ユーザには、取引先の AnnualRevenue を更新する権限がありません。
1String jsonInput =
2'[' +
3'{' +
4'"Name": "InGen",' +
5'"AnnualRevenue": "100"' +
6'},' +
7'{' +
8'"Name": "Octan"' +
9'}' +
10']';
11
12List<Account> accounts = (List<Account>)JSON.deserializeStrict(jsonInput, List<Account>.class);
13SObjectAccessDecision securityDecision = Security.stripInaccessible(
14AccessType.UPDATABLE,
15accounts);
16
17// Secure update
18update securityDecision.getRecords(); // Doesn’t update AnnualRevenue field
19System.debug(String.join(securityDecision.getRemovedFields().get('Account'), ', ')); // Prints "AnnualRevenue"
20System.debug(String.join(securityDecision.getModifiedIndexes(), ', ')); // Prints "0”